Đỗ Quang Hiếu

#hashtag
1.072
19 theo dõi 26 bạn bè
Thông tin
Link tài khoản:
Xem trên Lazigo
Thành tích: 0 câu hỏi | 4 trả lời
Điểm số: 3đ giải bài | 10đ tặng
Chưa đạt Huy hiệu Học tập
Số ngày hoạt động: 144 ngày
Huy hiệu Chuyên cần:
Khởi đầu
Khởi đầu
Thử thách
Thử thách
Huy hiệu (+)
9 - 4 - 2010
Học lực: Giỏi
Cấp học:
Môn học yêu thích: Tin học
Tình trạng: Chưa xác định
Sở thích: Chưa xác định
Quận 1 - TP. Hồ Chí Minh
Đã tham gia: 09-08-2021
Số ngày hoạt động: 144 ngày
Ảnh nền
Báo cáo vi phạm
4.8
86 sao / 18 đánh giá
5 sao - 17 đánh giá
4 sao - 0 đánh giá
3 sao - 0 đánh giá
2 sao - 0 đánh giá
1 sao - 1 đánh giá
Điểm 4.8 SAO trên tổng số 18 đánh giá
0 quà tặng | 0 câu hỏi | 4 trả lời
7 1
Đỗ Quang Hiếu
Link | Report
2023-09-06 19:43:00
Chat Online
1 0
no name | Chat Online Report
bro?
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-09-01 18:10:54
Chat Online

GameSettings.physicsSectorSize=0

GameSettings.physicsSectorSize=100
 

0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-08-31 13:19:41
Chat Online
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-08-30 20:31:33
Chat Online
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-08-28 19:50:10
Chat Online
  1. // ==UserScript==
  2. // @name Duolingo-Cheat-Tool
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.2
  5. // @description Auto answer Duolingo script!
  6. // @author tranphuquy19
  7. // @match https://www.duolingo.com/lesson*
  8. // @match https://www.duolingo.com/learn*
  9. // @icon https://www.google.com/s2/favicons?domain=duolingo.com
  10. // @grant none
  11. // @run-at document-end
  12. // ==/UserScript==
  13.  
  14. // WARNING/DISCLAIMER: Cheating can lead to account ban. The script is research-oriented in programming.
  15. // Enjoy learning new languages. Thank you!
  16. // Update 2023-Aug-07: Fix bug, add new challenge types
  17.  
  18.  
  19. const DEBUG = true;
  20. // let AUTO_PRACTICE = localStorage.getItem('AUTO_PRACTICE') === 'true' ? true : false; // earn exp by practice
  21. let AUTO_PRACTICE = false;
  22. let mainInterval;
  23. let practiceInterval;
  24.  
  25. const dataTestComponentClassName = 'e4VJZ';
  26.  
  27. const TIME_OUT = 1000;
  28.  
  29. // Challenge types
  30. const CHARACTER_SELECT_TYPE = 'characterSelect';
  31. const CHARACTER_MATCH_TYPE = 'characterMatch';
  32. const MATCH_TYPE = 'match';
  33. const TRANSLATE_TYPE = 'translate';
  34. const LISTEN_TAP_TYPE = 'listenTap';
  35. const NAME_TYPE = 'name';
  36. const COMPLETE_REVERSE_TRANSLATION_TYPE = 'completeReverseTranslation';
  37. const LISTEN_TYPE = 'listen';
  38. const SELECT_TYPE = 'select';
  39. const JUDGE_TYPE = 'judge';
  40. const FORM_TYPE = 'form';
  41. const LISTEN_COMPREHENSION_TYPE = 'listenComprehension';
  42. const READ_COMPREHENSION_TYPE = 'readComprehension';
  43. const CHARACTER_INTRO_TYPE = 'characterIntro';
  44. const DIALOGUE_TYPE = 'dialogue';
  45. const SELECT_TRANSCRIPTION_TYPE = 'selectTranscription';
  46. const SPEAK_TYPE = 'speak';
  47. const SELECT_PRONUNCIATION_TYPE = 'selectPronunciation';
  48. const ASSIST_TYPE = 'assist';
  49. const LISTEN_MATCH_TYPE = 'listenMatch';
  50. const LISTEN_COMPLETE_TYPE = 'listenComplete';
  51.  
  52. // Query DOM keys
  53. const CHALLENGE_CHOICE_CARD = '[data-test="challenge-choice"]';
  54. const CHALLENGE_CHOICE = '[data-test="challenge-choice"]';
  55. const CHALLENGE_TRANSLATE_INPUT = '[data-test="challenge-translate-input"]';
  56. const CHALLENGE_LISTEN_TAP = '[data-test="challenge-listenTap"]';
  57. const CHALLENGE_JUDGE_TEXT = '[data-test="challenge-judge-text"]';
  58. const CHALLENGE_TEXT_INPUT = '[data-test="challenge-text-input"]';
  59. const CHALLENGE_TAP_TOKEN = '[data-test*="-challenge-tap-token"]';
  60. const PLAYER_NEXT = '[data-test="player-next"]';
  61. const PLAYER_SKIP = '[data-test="player-skip"]';
  62. const BLAME_INCORRECT = '[data-test="blame blame-incorrect"]';
  63. const CHARACTER_MATCH = '[data-test="challenge challenge-characterMatch"]';
  64. const PRACTICE_BTN = '[data-test="global-practice"]';
  65.  
  66. const clickEvent = new MouseEvent('click', {
  67. view: window,
  68. bubbles: true,
  69. cancelable: true
  70. });
  71.  
  72. function getChallengeObj(theObject) {
  73. let result = null;
  74. if (theObject instanceof Array) {
  75. for (let i = 0; i < theObject.length; i++) {
  76. result = getChallengeObj(theObject[i]);
  77. if (result) {
  78. break;
  79. }
  80. }
  81. }
  82. else {
  83. for (let prop in theObject) {
  84. if (prop == 'challenge') {
  85. if (typeof theObject[prop] == 'object') {
  86. return theObject;
  87. }
  88. }
  89. if (theObject[prop] instanceof Object || theObject[prop] instanceof Array) {
  90. result = getChallengeObj(theObject[prop]);
  91. if (result) {
  92. break;
  93. }
  94. }
  95. }
  96. }
  97. return result;
  98. }
  99.  
  100. function getChallenge() {
  101. // const dataTestComponentClassName = 'e4VJZ';
  102. const dataTestDOM = document.getElementsByClassName(dataTestComponentClassName)[0];
  103.  
  104. if (!dataTestDOM) {
  105. document.querySelectorAll(PLAYER_NEXT)[0].dispatchEvent(clickEvent);
  106. return null;
  107. } else {
  108. const dataTestAtrr = Object.keys(dataTestDOM).filter(att => /^__reactProps/g.test(att))[0];
  109. const childDataTestProps = dataTestDOM[dataTestAtrr];
  110. const { challenge } = getChallengeObj(childDataTestProps);
  111. if (DEBUG) console.log('challenge', challenge);
  112. return challenge;
  113. }
  114. }
  115.  
  116. function nextQuestion() {
  117. // document.dispatchEvent(new KeyboardEvent('keydown', { 'keyCode': 13, 'which': 13 }));
  118. document.querySelectorAll(PLAYER_NEXT)[0].dispatchEvent(clickEvent);
  119. }
  120.  
  121. function dynamicInput(element, msg) {
  122. let input = element;
  123. let lastValue = input.value;
  124. input.value = msg;
  125. let event = new Event('input', { bubbles: true });
  126. // hack React15
  127. event.simulated = true;
  128. // hack React16 内部定义了descriptor拦截value,此处重置状态
  129. let tracker = input._valueTracker;
  130. if (tracker) {
  131. tracker.setValue(lastValue);
  132. }
  133. input.dispatchEvent(event);
  134. }
  135.  
  136. function classify() {
  137. const challenge = getChallenge();
  138. if (!challenge) return;
  139. if (DEBUG) console.log(`${challenge.type}`, challenge);
  140. switch (challenge.type) {
  141. case SELECT_PRONUNCIATION_TYPE:
  142. case READ_COMPREHENSION_TYPE:
  143. case LISTEN_COMPREHENSION_TYPE:
  144. case ASSIST_TYPE:
  145. case FORM_TYPE: { // trắc nghiệm 1 đáp án
  146. const { choices, correctIndex } = challenge;
  147. if (DEBUG) console.log('READ_COMPREHENSION LISTEN_COMPREHENSION FORM ASSIST', { choices, correctIndex });
  148. document.querySelectorAll(CHALLENGE_CHOICE)[correctIndex].dispatchEvent(clickEvent);
  149. return { choices, correctIndex };
  150. }
  151.  
  152. case SELECT_TYPE:
  153. case CHARACTER_SELECT_TYPE: { // trắc nghiệm 1 đáp án
  154. const { choices, correctIndex } = challenge;
  155. if (DEBUG) console.log('SELECT CHARACTER_SELECT', { choices, correctIndex });
  156. document.querySelectorAll(CHALLENGE_CHOICE_CARD)[correctIndex].dispatchEvent(clickEvent);
  157. return { choices, correctIndex };
  158. }
  159.  
  160. case MATCH_TYPE: {
  161. const { pairs } = challenge;
  162. // remove all span tag element
  163. const tokens = Array.from(document.querySelectorAll(CHALLENGE_TAP_TOKEN)).filter(token => token.tagName !== 'SPAN');
  164. pairs.forEach((pair) => {
  165. for (let i = 0; i < tokens.length; i++) {
  166. const _innerText = tokens[i].innerText.split('\n')[1];
  167. if (_innerText === pair.fromToken || _innerText === pair.learningToken) {
  168. tokens[i].dispatchEvent(clickEvent);
  169. }
  170. }
  171. })
  172. return { pairs };
  173. }
  174.  
  175. case LISTEN_MATCH_TYPE: {
  176. const { pairs } = challenge;
  177. const tokens = Array.from(document.querySelectorAll(CHALLENGE_TAP_TOKEN));
  178. // click 2 token has same attribute 'data-test'
  179. for (let i = 0; i < tokens.length; i++) {
  180. const firstToken = tokens[i];
  181. for (let j = i + 1; j < tokens.length; j++) {
  182. const secondToken = tokens[j];
  183. if (firstToken.getAttribute('data-test') === secondToken.getAttribute('data-test')) {
  184. firstToken.dispatchEvent(clickEvent);
  185. secondToken.dispatchEvent(clickEvent);
  186. }
  187. }
  188. }
  189. return { pairs };
  190. }
  191.  
  192.  
  193.  
  194. case CHARACTER_MATCH_TYPE: { // tập hợp các cặp thẻ
  195. const { pairs } = challenge;
  196. const tokens = document.querySelectorAll(CHALLENGE_TAP_TOKEN);
  197. pairs.forEach((pair) => {
  198. for (let i = 0; i < tokens.length; i++) {
  199. const _innerText = tokens[i].innerText.split('\n')[1];
  200. if (_innerText === pair.transliteration || _innerText === pair.character) {
  201. tokens[i].dispatchEvent(clickEvent);
  202. }
  203. }
  204. })
  205. return { pairs };
  206. }
  207.  
  208. case TRANSLATE_TYPE: {
  209. const { correctTokens, correctSolutions } = challenge;
  210. if (correctTokens) {
  211. if (DEBUG) console.log('TRANSLATE_correctTokens', { correctTokens });
  212. const tokens = document.querySelectorAll(CHALLENGE_TAP_TOKEN);
  213. let ignoreTokeIndexes = [];
  214. for (let correctTokenIndex in correctTokens) {
  215. for (let tokenIndex in tokens) {
  216. const token = tokens[tokenIndex];
  217. if (ignoreTokeIndexes.includes(tokenIndex)) continue;
  218. if (token.innerText === correctTokens[correctTokenIndex]) {
  219. token.dispatchEvent(clickEvent);
  220. ignoreTokeIndexes.push(tokenIndex);
  221. if (DEBUG) console.log(`correctTokenIndex [${correctTokens[correctTokenIndex]}] - tokenIndex [${token.innerText}]`);
  222. break;
  223. };
  224. }
  225. }
  226. } else if (!!correctSolutions) {
  227. if (DEBUG) console.log('TRANSLATE_correctSolutions', { correctSolutions });
  228. let textInputElement = document.querySelectorAll(CHALLENGE_TRANSLATE_INPUT)[0];
  229. dynamicInput(textInputElement, correctSolutions[0]);
  230. }
  231.  
  232. return { correctTokens };
  233. }
  234.  
  235. case NAME_TYPE: { // nhập đán án
  236. const { correctSolutions } = challenge;
  237. if (DEBUG) console.log('NAME', { correctSolutions });
  238. let textInputElement = document.querySelectorAll(CHALLENGE_TEXT_INPUT)[0];
  239. let correctSolution = correctSolutions[0];
  240. dynamicInput(textInputElement, correctSolution);
  241. return { correctSolutions };
  242. }
  243.  
  244. case COMPLETE_REVERSE_TRANSLATION_TYPE: { // điền vào từ còn thiếu
  245. const { displayTokens } = challenge;
  246. if (DEBUG) console.log('COMPLETE_REVERSE_TRANLATION', { displayTokens });
  247. const { text } = displayTokens.filter(token => token.isBlank)[0];
  248. let textInputElement = document.querySelectorAll(CHALLENGE_TEXT_INPUT)[0];
  249. dynamicInput(textInputElement, text);
  250. return { displayTokens };
  251. }
  252.  
  253. case LISTEN_TAP_TYPE: {
  254. const { correctTokens } = challenge;
  255. if (DEBUG) console.log('LISTEN_TAP', { correctTokens });
  256. const tokens = document.querySelectorAll(CHALLENGE_TAP_TOKEN);
  257. const ignoreTokens = [];
  258. for (let i = 0; i < correctTokens.length; i++) {
  259. for (let j = 0; j < tokens.length; j++) {
  260. if (tokens[j].innerText === correctTokens[i] && !ignoreTokens.includes(j)) {
  261. ignoreTokens.push(j);
  262. tokens[j].dispatchEvent(clickEvent);
  263. break;
  264. }
  265. }
  266. }
  267. return { correctTokens };
  268. }
  269.  
  270. case LISTEN_COMPLETE_TYPE: {
  271. const { displayTokens } = challenge;
  272. if (DEBUG) console.log('LISTEN_COMPLETE', { displayTokens });
  273. let textInputElement = document.querySelectorAll(CHALLENGE_TEXT_INPUT)[0];
  274. const correctAnswer = displayTokens.find(token => token.isBlank).text;
  275. dynamicInput(textInputElement, correctAnswer);
  276. return { displayTokens };
  277. }
  278.  
  279. case LISTEN_TYPE: { // nghe và điền vào ô input
  280. const { prompt } = challenge;
  281. if (DEBUG) console.log('LISTEN', { prompt });
  282. let textInputElement = document.querySelectorAll(CHALLENGE_TRANSLATE_INPUT)[0];
  283. dynamicInput(textInputElement, prompt);
  284. return { prompt };
  285. }
  286.  
  287. case JUDGE_TYPE: { // trắc nghiệm 1 đáp án
  288. const { correctIndices } = challenge;
  289. if (DEBUG) console.log('JUDGE', { correctIndices });
  290. document.querySelectorAll(CHALLENGE_JUDGE_TEXT)[correctIndices[0]].dispatchEvent(clickEvent);
  291. return { correctIndices };
  292. }
  293.  
  294. case DIALOGUE_TYPE:
  295. case CHARACTER_INTRO_TYPE: { // trắc nghiệm 1 đáp án
  296. const { choices, correctIndex } = challenge;
  297. if (DEBUG) console.log('DIALOGUE CHARACTER_INTRO', { choices, correctIndex });
  298. document.querySelectorAll(CHALLENGE_JUDGE_TEXT)[correctIndex].dispatchEvent(clickEvent);
  299. return { choices, correctIndex };
  300. }
  301.  
  302. case SELECT_TRANSCRIPTION_TYPE: {
  303. const { choices, correctIndex } = challenge;
  304. if (DEBUG) console.log('DIALOGUE CHARACTER_INTRO', { choices, correctIndex });
  305. document.querySelectorAll(CHALLENGE_JUDGE_TEXT)[correctIndex].dispatchEvent(clickEvent);
  306. return { choices, correctIndex };
  307. }
  308.  
  309. case SPEAK_TYPE: {
  310. const { prompt } = challenge;
  311. if (DEBUG) console.log('SPEAK', { prompt });
  312. document.querySelectorAll(PLAYER_SKIP)[0].dispatchEvent(clickEvent);
  313. return { prompt };
  314. }
  315.  
  316. default:
  317. break;
  318. }
  319. }
  320.  
  321. function breakWhenIncorrect() {
  322. const isBreak = document.querySelectorAll(BLAME_INCORRECT).length > 0;
  323. if (isBreak) {
  324. console.log('Incorrect, stopped');
  325. clearInterval(mainInterval);
  326. };
  327. }
  328.  
  329. function clickPracticeButton() {
  330. try {
  331. document.querySelectorAll(PRACTICE_BTN)[0].dispatchEvent(clickEvent);
  332. } catch (e) {
  333. console.log(e);
  334. }
  335. }
  336.  
  337. function main() {
  338. try {
  339. let isPlayerNext = document.querySelectorAll(PLAYER_NEXT)[0].textContent.toUpperCase();
  340. if (isPlayerNext.valueOf() !== 'CONTINUE') {
  341. classify();
  342. breakWhenIncorrect()
  343. nextQuestion();
  344. }
  345. setTimeout(nextQuestion, 150);
  346.  
  347. } catch (e) {
  348. console.log(e);
  349. }
  350. }
  351.  
  352. function solveChallenge() {
  353. AUTO_PRACTICE = localStorage.getItem('AUTO_PRACTICE') || false; // earn exp by practice
  354. if (AUTO_PRACTICE && [removed].href.endsWith('/learn')) {
  355. // click practice button
  356. practiceInterval = setTimeout(clickPracticeButton, 5000);
  357. }
  358. mainInterval = setInterval(main, TIME_OUT);
  359. console.log(`to stop run this command clearInterval(${mainInterval})`);
  360. }
  361.  
  362. // solveChallenge();
  363. (solveChallenge)();
0 0
Đỗ Quang Hiếu | Chat Online Report
code hack duolingo ó
0 0
Trần Ngọc Long đi xe ô tô | Chat Online Report
tao chỉ cần ngồi xem à mày
0 0
Đỗ Quang Hiếu | Chat Online Report
Ừ đứng zậy
1 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-08-26 17:26:07
Chat Online
1 0
Sayara | Chat Online Report
-Đã like! Like hộ tus đầu?
​-Tt chéo?
0 0
Trần Ngọc Long đi xe ô tô | Chat Online Report
làm speakerman nha
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-07-20 19:08:30
Chat Online
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-07-20 19:05:44
Chat Online
1 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-07-20 19:05:14
Chat Online
1 0
Trần Ngọc Long đi xe ô tô | Chat Online Report
ủa mày bê đê à
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập

Đỗ Quang Hiếu
Link | Report
2023-07-20 19:04:47
Chat Online
0 0
Đăng nhập tài khoản để có thể bình luận cho nội dung này!

Đăng ký | Đăng nhập