免责声明:项目只供学习交流使用,请勿商用,商用违法,刷币有封号危险!!! 大家尽量支持正版!!!!
作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/111321299
一、引言
因为考研用到了不背单词app,这个软件做的还是很好的所以就入手了,但是缺点就是里面有一些扩展功能和单词书需要花钱买,内购项目可以用酷币抵用,然后就萌生刷酷币的想法。app中分享的连接只要有一个新用户点进去你就会获得一定量的酷币,因为用户不涉及到账号的登录,所以思路就很简单了,用pyt脚本实现模拟请求链接就可以啦,于是顺着这个思路写了下去。先来成功截图 话不多说,先上成功截图 PS:如学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获取此数据,来进行判断当前请求是否成功