免责声明:项目只供学习交流使用,请勿商用,商用违法,刷币有封号危险!!!
大家尽量支持正版!!!!
作者:小成Charles
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/111321299
最新更新:我已将此bug提交给了官方
一、引言
因为考研用到了不背单词app
,这个软件做的还是很好的所以就入手了,但是缺点就是里面有一些扩展功能和单词书需要花钱买,内购项目可以用酷币抵用,然后就萌生刷酷币的想法。app中分享的连接只要有一个新用户点进去你就会获得一定量的酷币,因为用户不涉及到账号的登录,所以思路就很简单了,用python
脚本实现模拟请求链接就可以啦,于是顺着这个思路写了下去。先来成功截图
话不多说,先上成功截图
二、 直接进行Request请求
代码如下
url = 'https://learnywhere.cn/bb/activity/article/2020/0619/news' \
'?key=108039b518584c6cacafaafa7712bec4&feat=u47617382&sha' \
're_platform=wechat&show_user_info=1'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (K'
'HTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201',
}
response = requests.get(url, headers=headers)
print(response.text)
代码设置了浏览器标签,模拟浏览器访问,运行结果大致如下:
d=app></div><script>!(function (a, b) {
if (!b.__SV) {
var c, d, e, f;
(window.dplus = b),
(b._i = []),
(b.init = function (a, c, d) {
function g(a, b) {
var c = b.split('.');
2 == c.length && ((a = a[c[0]]), (b = c[1])),
(a[b] = function () {
a.push([b].concat(Array.prototype.slice.call(arguments, 0)));
});
}.....
然后发现账号的酷币没有任何变化,即使是新设备也毫无作用,然后分析了一下,这个实现的过程是先通过JavaScript
渲染的过程,然后通过Ajax
从服务器获取数据并判断当前设备是否为新设备,那么request
请求是肯定不可用的,于是就想到用selenium
来进行渲染获取数据
三、利用selenium和ChormeDriver进行JavaScript渲染
首先安装selenium
和ChormeDriver
,具体方法请网上查询,不在赘述。
前期准备:
这里我们尽量准备大约一千个‘User-Agent’
用来添加到headers
,这里直接在网上找个在线生成器就可以(网上一大堆),然后我方便测试就放在一个txt文档如图所示一大堆
然后此代码块实现读取并存到数组中,并随机获取一个agent
:
def get_agen_list():
with open("D:/0DESK/UserAgentList.txt", 'r') as file_to_read:
while True:
lines = file_to_read.readline()
if not lines:
break
pass
listAgent.append(lines)
pass
print(len(listAgent))
get_agen_list()
# 随机获取一个agent
USER_AGENT = listAgent[random.randint(0, 999)]
接下来就是实现渲染了,执行一下代码就可以发现界面显示你是新用户,然后app中的酷币也相应的增加了:
chrome_options = Options()
chrome_options.add_argument("--User-Agent="+USER_AGENT)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('https://learnywhere.cn/bb/activity/article/2020/0619/news?key=0926438a01e84a34bb1823447ddb007f&feat'
'=u47617382&share_platform=wechat&show_user_info=1')
其实到这里就基本可以了,但是经测试,同一个IP请求次数过多就会出现你是老用户,大多数网站都会这样的,对付这样的措施我们可以利用代理IP进行访问,实现方法就是给option
添加add_argument
四、添加代理IP访问
–以下文章借鉴崔庆才的《Python3 网络爬虫开发实战》
代理IP就可以反IP检测系统了,代理IP可以使用免费的也可以收费的,当然收费的质量很高,更加稳定一些,如下代码实现代理添加的方式,如果你的代理IP是没有账号密码的可以这样:
from selenium import webdriver
proxy = '127.0.0.1:9743'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')
在这里我们通过 ChromeOptions
来设置代理,在创建 Chrome
对象的时候通过 chrome_options
参数传递即可。 这样在运行之后便会弹出一个 Chrome
浏览器,访问目标链接之后输出结果如下:
{
"args": {
},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8",
"Connection": "close",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
},
"origin": "106.185.45.153",
"url": "http://httpbin.org/get"
}
可以看到 origin
同样为代理 IP
的地址,代理设置成功。 如果代理是认证代理,则设置方法相对比较麻烦,方法如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import zipfile
ip = '127.0.0.1'
port = 9743
username = 'foo'
password = 'bar'
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
}
}
"""
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%(ip)s",
port: %(port)s
}
}
}
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%(username)s",
password: "%(password)s"
}
}
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
)
""" % {
'ip': ip, 'port': port, 'username': username, 'password': password}
plugin_file = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_file, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_extension(plugin_file)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')
在这里需要在本地创建一个 manifest.json
配置文件和 background.js
脚本来设置认证代理,运行之后本地会生成一个 proxy_auth_plugin.zip
文件保存配置。 运行结果和上例一致,origin
同样为代理 IP
。
五、扩展
如果出现以下截一图就说明当前刷币成功,因为你是新用户
然后我们同过检查NetWork
下的XHR
可以发现网页请求的过程,在report
…那一列中我们点击Preview
可以发现newDevice
的数量为1
,说明当前系统判断为新设备,就是成功成功了,如果你想更完善程序的话,可以通过Ajax
获取此数据,来进行判断当前请求是否成功
作者:小成Charles
原创作品
转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/111321299
转载:https://blog.csdn.net/weixin_42999453/article/details/111321299