Skip to content

Commit

Permalink
use 2captcha api to solve verify code
Browse files Browse the repository at this point in the history
  • Loading branch information
harryhare committed Aug 1, 2021
1 parent acb280e commit 2e076ee
Show file tree
Hide file tree
Showing 9 changed files with 4,410 additions and 85 deletions.
25 changes: 20 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,17 @@

## Notice

**程序已失效**
**更新验证模块**

使用此网站[2captcha.com](https://2captcha.com?from=12332166)提供的api。

但是该API 收费,一亩三分地的验证码是 reCAPTCHA v2 - hard ,对应的[收费](https://2captcha.com/2captcha-api)是 $2.99/1000次请求

如果想使用需要注册账号+充值只少3刀(单个账号可以用500天左右)+ 复制 apikey 替换configure/data.json 文件中的字段



**程序失效**

论坛增加了google Google reCAPTCHA 验证码,导致程序失效

Expand Down Expand Up @@ -39,7 +49,7 @@

[一亩三分地](https://www.1point3acres.com/bbs/) 自动签到、答题

一分钟快速设置,无 aws 依赖,验证码自动识别,一次性设置后再无需手动操作
快速设置,无 aws 依赖,验证码自动识别,一次性设置后再无需手动操作

* 程序会自动识别验证码

Expand All @@ -51,11 +61,16 @@

## how to use

~~下面几种执行模式任选一种即可。~~
下面几种执行模式任选一种即可。

### ~~本地 crontab 模式(由于验证码机制更改,现已失效)~~
### 本地 crontab 模式

* 修改 configure/data.json,用你的用户名密码替换文件中的相应字段
* 注册[2captcha.com](https://2captcha.com?from=12332166) 得到 apikey 并充值
<details>
<summary>具体操作展开查看</summary>
![](screenshots/2captcha.png)
</details>
* 修改 configure/data.json,用你的用户名,密码,apikey替换文件中的相应字段

* 安装依赖
以 ubuntu 为例,其他系统请用相应的方式安装依赖
Expand Down
3 changes: 1 addition & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
requests==2.22.0
lxml==4.6.3
cssselect==1.1.0
pytesseract==0.3.7
Pillow==8.2.0
TwoCaptcha==0.0.1


5 changes: 5 additions & 0 deletions src/questions.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@
'把一亩三分地介绍给朋友的正确姿势不包括什么?': '直接把我的账号密码给朋友用',
'关于论坛账号分享的说法,哪些正确?': '这些都不对',
'如果我把论坛积分隐藏内容公开发出来会怎么样?':'会被扣分,情节严重者会封号',
'以下关于帖子审核,哪些说法正确?':'这些都不正确',
# 我感觉这道题答案错了
#'在论坛发slack群、qq群、微信群等任何站外讨论方式,会如何?':'以上都正确',
'在论坛发slack群、qq群、微信群等任何站外讨论方式,会如何?':'如果发在本地版聚、租房找室友、飞友学友工友版块,可以找到小伙伴',

#以下没有验证
'一亩三分地发面经的规则有哪些?':'以上都正确',
Expand All @@ -147,3 +151,4 @@
# 7.27 2
# 7.28 1
# 7.29 2
# 8.1 0
147 changes: 76 additions & 71 deletions src/raw_requests.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
import requests
import urllib.parse
import re
from PIL import Image
from process_gif import get_code_from_gif
from cfproxy import CFProxy
import xml.dom.minidom as xml
import lxml.html as html
import questions
Expand Down Expand Up @@ -38,7 +35,9 @@
worker = "www.laika42.top"
# ip = '104.26.8.210'
ip = '116.234.47.7'
proxy = CFProxy(worker, user_agent, ip)


# proxy = CFProxy(worker, user_agent, ip)


def save_error(response: requests.Response, error_desc: str = ""):
Expand All @@ -63,7 +62,7 @@ def check_status_code(response: requests.Response, error_desc: str = ""):

def get_login_info_() -> (str, str):
global cookie_jar
global proxy
# global proxy
header = {
"User-Agent": user_agent,
"Referer": referer,
Expand Down Expand Up @@ -176,69 +175,70 @@ def get_checkin_info_() -> (str, str):
return form_hash, sec_hash


def get_verify_code_(id_hash) -> str:
global cookie_jar
print("get verify code...")
header = {
"User-Agent": user_agent,
"Referer": referer
}
# print(cookie_jar)
response = requests.get(get_verify_code_url % (id_hash, id_hash), headers=header, cookies=cookie_jar)
# response = proxy.get(get_verify_code_url % (id_hash, id_hash), headers=header, cookies=cookie_jar)
cookie_jar.update(response.cookies)
check_status_code(response, "get verify code phase 1 error")
# misc.php?mod = seccode & update = 86288 & idhash = S0
pattern = re.compile('src="([a-zA-Z0-9=&?.]+)"')
srcs = pattern.findall(response.text)
verify_code_url = ""
if len(srcs) >= 1:
verify_code_url = "https://www.1point3acres.com/bbs/" + srcs[0]
else:
print("response 中没有 验证码 的 url")
print(response.text)
exit(-1)
response = requests.get(verify_code_url, headers=header, cookies=cookie_jar)
# response = proxy.get(verify_code_url, headers=header, cookies=cookie_jar)
cookie_jar.update(response.cookies)
check_status_code(response, "get verify code phase 2 error")
# print(len(response.content)) # 文件大小
tmpfilename = "tmp.gif"
if os.name == "posix":
tmpfilename = "/tmp/" + tmpfilename
file = open(tmpfilename, "wb")
file.write(response.content)
file.close()
f = Image.open(tmpfilename)
# f.show()
return get_code_from_gif(f)


def check_verify_code_(id_hash, code):
global cookie_jar
print("check verify code...")

header = {
"User-Agent": user_agent,
# "Referer": "https://www.1point3acres.com/bbs/dsu_paulsign-sign.html"
"Referer": referer
}
response = requests.get(check_verify_code_url % (id_hash, code), headers=header, cookies=cookie_jar)
# response = proxy.get(check_verify_code_url % (id_hash, code), headers=header, cookies=cookie_jar)
cookie_jar.update(response.cookies)
check_status_code(response, "check verify code phase 1 error")
if "succeed" in response.text:
print("verify code is right")
return True
if "invalid" in response.text:
print("verify code is wrong")
return False
print("verify error")
print(response.text)
exit(-1)


def do_daily_checkin_(verify_code: str, form_hash: str, sec_hash: str = "S00") -> bool:
#
# def get_verify_code_(id_hash) -> str:
# global cookie_jar
# print("get verify code...")
# header = {
# "User-Agent": user_agent,
# "Referer": referer
# }
# # print(cookie_jar)
# response = requests.get(get_verify_code_url % (id_hash, id_hash), headers=header, cookies=cookie_jar)
# # response = proxy.get(get_verify_code_url % (id_hash, id_hash), headers=header, cookies=cookie_jar)
# cookie_jar.update(response.cookies)
# check_status_code(response, "get verify code phase 1 error")
# # misc.php?mod = seccode & update = 86288 & idhash = S0
# pattern = re.compile('src="([a-zA-Z0-9=&?.]+)"')
# srcs = pattern.findall(response.text)
# verify_code_url = ""
# if len(srcs) >= 1:
# verify_code_url = "https://www.1point3acres.com/bbs/" + srcs[0]
# else:
# print("response 中没有 验证码 的 url")
# print(response.text)
# exit(-1)
# response = requests.get(verify_code_url, headers=header, cookies=cookie_jar)
# # response = proxy.get(verify_code_url, headers=header, cookies=cookie_jar)
# cookie_jar.update(response.cookies)
# check_status_code(response, "get verify code phase 2 error")
# # print(len(response.content)) # 文件大小
# tmpfilename = "tmp.gif"
# if os.name == "posix":
# tmpfilename = "/tmp/" + tmpfilename
# file = open(tmpfilename, "wb")
# file.write(response.content)
# file.close()
# f = Image.open(tmpfilename)
# # f.show()
# return get_code_from_gif(f)
#
#
# def check_verify_code_(id_hash, code):
# global cookie_jar
# print("check verify code...")
#
# header = {
# "User-Agent": user_agent,
# # "Referer": "https://www.1point3acres.com/bbs/dsu_paulsign-sign.html"
# "Referer": referer
# }
# response = requests.get(check_verify_code_url % (id_hash, code), headers=header, cookies=cookie_jar)
# # response = proxy.get(check_verify_code_url % (id_hash, code), headers=header, cookies=cookie_jar)
# cookie_jar.update(response.cookies)
# check_status_code(response, "check verify code phase 1 error")
# if "succeed" in response.text:
# print("verify code is right")
# return True
# if "invalid" in response.text:
# print("verify code is wrong")
# return False
# print("verify error")
# print(response.text)
# exit(-1)
#

def do_daily_checkin_(g_token: str, form_hash: str, sec_hash: str = "S00") -> bool:
global cookie_jar
header = {
"User-Agent": user_agent,
Expand All @@ -254,7 +254,7 @@ def do_daily_checkin_(verify_code: str, form_hash: str, sec_hash: str = "S00") -
"sechash": sec_hash,
"seccodehash": sec_hash,
"seccodeverify": sec_hash,
"g-recaptcha-response": "",
"g-recaptcha-response": g_token,
}

response = requests.post(post_checkin_url, headers=header, data=body, cookies=cookie_jar)
Expand Down Expand Up @@ -337,7 +337,7 @@ def get_daily_task_answer() -> (str, str, str):
return answer_id, form_hash, sec_hash


def do_daily_question_(answer: str, verify_code: str, form_hash: str, sec_hash: str = "SA00") -> bool:
def do_daily_question_(answer: str, g_token: str, form_hash: str, sec_hash: str = "SA00") -> bool:
global cookie_jar
header = {
"User-Agent": user_agent,
Expand All @@ -348,7 +348,9 @@ def do_daily_question_(answer: str, verify_code: str, form_hash: str, sec_hash:
"formhash": form_hash,
"answer": answer,
"sechash": sec_hash,
"seccodeverify": verify_code,
"seccodehash": sec_hash,
"seccodeverify": sec_hash,
"g-recaptcha-response": g_token,
"submit": "true"
}
# 网站的原版请求是 multipart/form-data ,但是我发现用 application/x-www-form-urlencoded 也是可以的
Expand All @@ -368,6 +370,9 @@ def do_daily_question_(answer: str, verify_code: str, form_hash: str, sec_hash:
elif "恭喜你,回答正确" in response.text:
print("答题成功")
return True
elif "抱歉,回答错误!扣除1大米" in response.text:
print("答案错了,请报 issue: https://github.com/harryhare/1point3acres/issues/new")
return True
else:
save_error(response, "post answer")
return False
28 changes: 21 additions & 7 deletions src/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import hashlib
from raw_requests import *
import sys
from twocaptcha import TwoCaptcha


# 签到流程
Expand Down Expand Up @@ -44,6 +45,22 @@ def get_verify_code(id_hash) -> str:
return verify_code


def get_g_token(api_key, url) -> str:
solver = TwoCaptcha(api_key)
try:
result = solver.solve_captcha(
site_key='6LeCeskbAAAAAE-5ns6vBXkLrcly-kgyq6uAriBR',
page_url=url)

except Exception as e:
print(e)
exit(-1)
return ""
else:
print('solved: ' + str(result))
return result


# 如果 login 失败, 后面的操作没必要再做,直接 exit
def daily_login(username: str, password_hashed: str):
print("do login...")
Expand All @@ -61,10 +78,10 @@ def daily_checkin(api_key: str) -> bool:
time.sleep(2)
if form_hash == "":
return False
code = get_verify_code(sec_hash)
code = get_g_token(api_key, get_checkin_url)
if code == "":
return False
return do_daily_checkin_(verify_code=code, form_hash=form_hash, sec_hash=sec_hash)
return do_daily_checkin_(g_token=code, form_hash=form_hash, sec_hash=sec_hash)


def daily_question(api_key: str) -> bool:
Expand All @@ -73,10 +90,10 @@ def daily_question(api_key: str) -> bool:
time.sleep(2)
if form_hash == "" or answer == "":
return False
code = get_verify_code(sec_hash)
code = get_g_token(api_key, get_checkin_url)
if code == "":
return False
return do_daily_question_(answer=answer, verify_code=code, form_hash=form_hash, sec_hash=sec_hash)
return do_daily_question_(answer=answer, g_token=code, form_hash=form_hash, sec_hash=sec_hash)


def do_all(username: str, password: str, api_key: str):
Expand All @@ -98,9 +115,6 @@ def main(from_file: bool = False):
else:
api_key = sys.argv[1]
users = json.loads(sys.argv[2].replace("'", '"'))
print(users)
print(api_key)
exit(0)
for user in users:
m = hashlib.md5()
m.update(user["password"].encode("ascii"))
Expand Down
Loading

0 comments on commit 2e076ee

Please sign in to comment.