前言
這次這個網站很巧,也是一個代理網站,不過這次不是我那老朋友給的了,是我自己偶然找到的,而且也是端口加密的,跟之前某篇文章差不多。
想源網址的,為了避免一些不必要的麻煩,私我給地址吧(直接在博客園私信,不用去其他地方,免得誤會我是為了推廣拉新啥的)
這個網站雖然是國外的(需要掛dl訪問),安全等級雖然也很低,對js逆向感興趣的可以拿來練練手,但拿到到網址的朋友也請不要毫不留情的去一直請求別人網站。
開始分析
打開網站
發現端口加密了(其實這里嚴格意義上都不叫加密),查看源碼確認:
確實如此
現在怎么辦呢,不用說,端口肯定是這幾個參數,控制台里看能直接訪問不:
能直接訪問,而且結果能對上,說明這幾個參數是全局定義的變量,到處都可以調用,說到這,你知道我上面為什么要說都不算加密了吧,這都沒涉及到js逆向的,直接就拿到了
接下來就找這幾個變量是在哪定義的了,既然是全局定義的,那么先找源碼里的script標簽的js代碼,看有沒有,沒有再去引入的js文件里找,不過,說實話,它這個都是小寫的字母,直接搜索確實不好搜,因為匹配到的太多了。
先找源碼里的script吧,從頭開始找
找到關鍵點
從頭一找就找到了,這運氣就是好:
而且這幾個參數的值我對應了下,確實能跟源碼展示的端口對上
接下來就是用python改寫這段代碼了
用python實現
在實現之前,先用xpath把值拿到
說下這里我為什么要拼接成字符串,因為這樣,才能更源碼里對上,因為源碼是用的字符串拼接,而不是數字加減:
那么這段代碼怎么執行呢,用exec,如下,我其實並沒有定義l,用exec后就可以直接調用
然后再把ip拿到,然后拼接起來就可以了,注意拼接端口時用的eval,而不是exec
用這個結果跟源碼對比:
發現能對上,ok了
完整代碼
import requests
from lxml import etree from lxml.html import tostring from bs4 import BeautifulSoup, Comment HEADERS = { 'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'cross-site', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'Connection': 'close', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36' } url = '' # 保密 req = requests.get(url, headers=HEADERS) res = req.content.decode('utf-8') html = etree.HTML(res) key = html.xpath('//script[contains(@src,"js1")]/following-sibling::script[1]/text()') key = ''.join(key) if key else '' key = key.strip().replace(' ', '').replace('=', '=str(').replace(';', ');') print(23123, key) end = [] if key: exec(key) data = html.xpath('//table[@id="proxylist"]/tr') for item in data: ip = item.xpath('./td[2]/text()') ip = ''.join(ip) if ip else '' port_temp = item.xpath('./td[2]/script/text()') port_temp = ''.join(port_temp) if port_temp else '' port_temp = port_temp.replace('document.write(":"+', '').replace(')', '') port = eval(port_temp) if ip and port: proxy = ip + ":" + port end.append(proxy) print(12312, len(end), end)
結語
是不是不算加密嘛?我反正是覺得真的不叫加密,只是看起來就點不好操作,但是你只要稍微的懂點javascript代碼都可以搞定的。
另外,請注意exec和eval的用法,這個是屬於python的基礎了,這個在我的從零學python的系列篇的文章里有的