Skip to content

Commit 0292c37

Browse files
committed
Add emojicaptchaprovider to solve emoji_captcha type captchas from 2ch.hk
1 parent 416fbe1 commit 0292c37

File tree

5 files changed

+358
-13
lines changed

5 files changed

+358
-13
lines changed

extensions/dvach/res/values-ru/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
<resources>
44
<string name="preference_captcha_full_keyboard">Использовать полную клавиатуру для капчи</string>
5+
<string name="emoji_captcha_input">Выберите все символы на картинке (в любом порядке)</string>
56
</resources>

extensions/dvach/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
<resources>
44
<string name="preference_captcha_full_keyboard">Use full keyboard for captcha</string>
5+
<string name="emoji_captcha_input">Select all icons from the picture (any order)</string>
56
</resources>

extensions/dvach/src/com/mishiranu/dashchan/chan/dvach/DvachChanConfiguration.java

+18-8
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717

1818
public class DvachChanConfiguration extends ChanConfiguration {
1919
public static final String CAPTCHA_TYPE_2CH_CAPTCHA = "2ch_captcha";
20+
public static final String CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA = "emoji_captcha";
2021

2122
public static final Map<String, String> CAPTCHA_TYPES;
2223

2324
static {
2425
Map<String, String> captchaTypes = new LinkedHashMap<>();
2526
captchaTypes.put(CAPTCHA_TYPE_2CH_CAPTCHA, "2chcaptcha");
27+
captchaTypes.put(CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA, "emoji");
2628
captchaTypes.put(CAPTCHA_TYPE_RECAPTCHA_2, "recaptcha");
2729
captchaTypes.put(CAPTCHA_TYPE_RECAPTCHA_2_INVISIBLE, "invisible_recaptcha");
2830
CAPTCHA_TYPES = Collections.unmodifiableMap(captchaTypes);
@@ -69,15 +71,23 @@ public Board obtainBoardConfiguration(String boardName) {
6971

7072
@Override
7173
public Captcha obtainCustomCaptchaConfiguration(String captchaType) {
72-
if (CAPTCHA_TYPE_2CH_CAPTCHA.equals(captchaType)) {
73-
Captcha captcha = new Captcha();
74-
captcha.title = "2ch Captcha";
75-
captcha.input = Captcha.Input.ALL;
76-
captcha.validity = Captcha.Validity.IN_THREAD;
77-
captcha.ttl = CAPTCHA_TTL;
78-
return captcha;
74+
Captcha captcha = new Captcha();
75+
switch (captchaType) {
76+
case CAPTCHA_TYPE_2CH_CAPTCHA:
77+
captcha.title = "2ch Captcha";
78+
captcha.input = Captcha.Input.ALL;
79+
captcha.validity = Captcha.Validity.IN_THREAD;
80+
captcha.ttl = CAPTCHA_TTL;
81+
return captcha;
82+
case CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA:
83+
captcha.title = "Emoji Captcha";
84+
captcha.input = Captcha.Input.ALL;
85+
captcha.validity = Captcha.Validity.IN_THREAD;
86+
captcha.ttl = CAPTCHA_TTL;
87+
return captcha;
88+
default:
89+
return null;
7990
}
80-
return null;
8191
}
8292

8393
@Override

extensions/dvach/src/com/mishiranu/dashchan/chan/dvach/DvachChanPerformer.java

+28-5
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,25 @@ private ReadCaptchaResult onReadCaptcha(ReadCaptchaData data, String captchaPass
10161016
}
10171017
}
10181018

1019-
} else if (DvachChanConfiguration.CAPTCHA_TYPE_RECAPTCHA_2.equals(data.captchaType) ||
1019+
} else if (DvachChanConfiguration.CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA.equals(data.captchaType)) {
1020+
if (data.mayShowLoadButton) {
1021+
return new ReadCaptchaResult(CaptchaState.NEED_LOAD, null);
1022+
}
1023+
DvachEmojiCaptchaProvider.DvachEmojiCaptchaAnswerRetriever retriever =
1024+
(Bitmap task, Bitmap[] keyboardImages) -> {
1025+
try {
1026+
return requireUserImageSingleChoice(-1,
1027+
keyboardImages,
1028+
configuration.getResources().getString(
1029+
R.string.emoji_captcha_input),
1030+
task);
1031+
} catch (HttpException e) {
1032+
return -1;
1033+
}
1034+
};
1035+
return new DvachEmojiCaptchaProvider(data, locator, id, retriever)
1036+
.loadEmojiCaptcha();
1037+
} else if (DvachChanConfiguration.CAPTCHA_TYPE_RECAPTCHA_2.equals(data.captchaType) ||
10201038
DvachChanConfiguration.CAPTCHA_TYPE_RECAPTCHA_2_INVISIBLE.equals(data.captchaType)) {
10211039
result = new ReadCaptchaResult(CaptchaState.CAPTCHA, captchaData);
10221040
captchaData.put(CaptchaData.API_KEY, id);
@@ -1091,14 +1109,19 @@ public SendPostResult onSendPost(SendPostData data) throws HttpException, ApiExc
10911109
String challenge = data.captchaData.get(CaptchaData.CHALLENGE);
10921110
String input = StringUtils.emptyIfNull(data.captchaData.get(CaptchaData.INPUT));
10931111

1094-
String remoteCaptchaType = DvachChanConfiguration.CAPTCHA_TYPES.get(data.captchaType);
1095-
if (remoteCaptchaType != null) {
1096-
entity.add("captcha_type", remoteCaptchaType);
1112+
if (!DvachChanConfiguration.CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA.equals(data.captchaType)) {
1113+
String remoteCaptchaType = DvachChanConfiguration.CAPTCHA_TYPES.get(data.captchaType);
1114+
if (remoteCaptchaType != null) {
1115+
entity.add("captcha_type", remoteCaptchaType);
1116+
}
10971117
}
10981118
if (DvachChanConfiguration.CAPTCHA_TYPE_2CH_CAPTCHA.equals(data.captchaType)) {
10991119
entity.add("2chcaptcha_id", challenge);
11001120
entity.add("2chcaptcha_value", input);
1101-
} else if (DvachChanConfiguration.CAPTCHA_TYPE_RECAPTCHA_2.equals(data.captchaType) ||
1121+
} else if (DvachChanConfiguration.CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA.equals(data.captchaType)) {
1122+
entity.add("captcha_type", DvachChanConfiguration.CAPTCHA_TYPE_2CH_EMOJI_CAPTCHA);
1123+
entity.add("emoji_captcha_id", challenge);
1124+
} else if (DvachChanConfiguration.CAPTCHA_TYPE_RECAPTCHA_2.equals(data.captchaType) ||
11021125
DvachChanConfiguration.CAPTCHA_TYPE_RECAPTCHA_2_INVISIBLE.equals(data.captchaType)) {
11031126
entity.add("g-recaptcha-response", input);
11041127
}

0 commit comments

Comments
 (0)