鱼C论坛

 找回密码
 立即注册
查看: 2111|回复: 7

[已解决]爬虫入门,模拟登录github时遇到了timestamp_secret怎么解呢?

[复制链接]
发表于 2021-8-31 23:16:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
爬虫入门,模拟登录github时遇到了timestamp和timestamp_secret,其中 timestamp 靠着百度解决了,但是后面这个搜网页源码 ,连个毛不会找
最佳答案
2021-9-2 11:49:33
data不用考虑那么多参数:
import requests
import re


def login():
    session = requests.session()
    session.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'}
    login_url = 'https://github.com/login'
    r = session.get(login_url)
    token = re.findall('name="authenticity_token" value="(.*?)"/>', r.text)[1]
    print(token)
    post_url = 'https://github.com/session'
    data = {
        'commit': 'Sign in',
        'utf8': '✓',
        'authenticity_token': token,
        'login': 'email',
        'password': 'password'
    }
    print(data)
    session.post(post_url, data=data)
    logined_url = 'https://github.com/settings/profile'
    r = session.get(logined_url)
    with open('github.html', 'w') as f:
        f.write(r.text)


if __name__ == '__main__':
    login()


别人的案例
import requests
from lxml import etree


class Login(object):
    def __init__(self):
        self.headers = {
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
            'Host': 'github.com'
        }
        self.login_url = 'https://github.com/login'
        self.post_url = 'https://github.com/session'
        self.logined_url = 'https://github.com/settings/profile'
        self.session = requests.Session()


    def token(self):
        response = self.session.get(self.login_url, headers=self.headers)
        selector = etree.HTML(response.text)
        token = selector.xpath('//input[1]/@value')[0]
        return token

    def login(self, email, password):
        post_data = {
            'commit': 'Sign in',
            'utf8': '✓',
            'authenticity_token': self.token(),
            'login': email,
            'password': password
        }
        response = self.session.post(self.post_url, data=post_data, headers=self.headers)
        if response.status_code == 200:
            self.dynamics(response.text)
        response = self.session.get(self.logined_url, headers=self.headers)
        if response.status_code == 200:
            self.profile(response.text)

    def dynamics(self, html):
        selector = etree.HTML(html)
        dynamics = selector.xpath('//div[contains(@class, "news")]//div[contains(@class, "alert")]')
        for item in dynamics:
            dynamic = ' '.join(item.xpath('.//div[@class="title"]//text()')).strip()
            print(dynamic)

    def profile(self, html):
        selector = etree.HTML(html)
        name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]
        email = selector.xpath('//select[@id="user_profile_email"]/option[2]/@value')[0]
        # 能正确显示自己账号的信息即为成功
        print(name, email)


if __name__ == "__main__":
    login = Login()
    login.login(email='账号', password='密码')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-1 07:29:20 From FishC Mobile | 显示全部楼层
本帖最后由 suchocolate 于 2021-9-1 07:33 编辑

贴一下你的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-2 00:04:13 | 显示全部楼层
suchocolate 发表于 2021-9-1 07:29
贴一下你的代码。
import requests
import re  #正则模块
import time
# 输入毫秒级的时间,转出正常格式的时间
def timeStamp(timeNum):
    global otherStyleTime
    timeStamp = float(timeNum / 1000)
    timeArray = time.localtime(timeStamp)
    otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
    return otherStyleTime

def login():
    #session
    session = requests.session()
    #headers
    session.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'}
    #url1  1.获取token  2. 发请求 3. 正则提取
    url1='https://github.com/login'
    response1=session.get(url1).content.decode()  #正则只对str操作,所以要转换
    #name="authenticity_token" value="VMAW29pzDbiHSBXuhaR0BhMPyPatsl/3FbZ8ig2MtiS2SXMw
    token=re.findall('name="authenticity_token" value="(.*?)"/>',response1)[1]  #.匹配多个*多个?非贪婪模式
    print(token)    #10054, '远程主机强迫关闭了一个现有的连接
    #url2  构建表单数据
    url2 ='https://github.com/session'
    data={'commit':'Sign in',
          'authenticity_token':'VMAW29pzDbiHSBXuhaR0BhMPyPatsl/3FbZ8ig2MtiS2SXMwOoKS2baWSNwEtX1qUcX7aVWo97N17Cz+8W21og==',
          'login':'',
          'password':'',
          'trusted_device':'',
          'webauthn-support':'supported',
          'webauthn-iuvpaa-support':'unsupported',
          'return_to':'https://github.com/login',
          'allow_signup':'',
          'client_id':'',
          'integration':'',
          'required_field_6ab1':'',
          'timestamp':otherStyleTime,
          'timestamp_secret':'cf8f6694c191d005c8b9171b29b9d8d4fad8f539801d0feb18417263f507fe42'}   #这玩意儿怎么搞?
    print(data)
    #请求登录
    session.post(url2,data=data)
    #验证
    url3='https://github.com/1667334486@qq.com'
    response=session.get(url3)
    with open('github.html','wb')as f:
        f.write(response.content)

if __name__ == '__main__':
    login()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-2 11:49:33 | 显示全部楼层    本楼为最佳答案   
data不用考虑那么多参数:
import requests
import re


def login():
    session = requests.session()
    session.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'}
    login_url = 'https://github.com/login'
    r = session.get(login_url)
    token = re.findall('name="authenticity_token" value="(.*?)"/>', r.text)[1]
    print(token)
    post_url = 'https://github.com/session'
    data = {
        'commit': 'Sign in',
        'utf8': '✓',
        'authenticity_token': token,
        'login': 'email',
        'password': 'password'
    }
    print(data)
    session.post(post_url, data=data)
    logined_url = 'https://github.com/settings/profile'
    r = session.get(logined_url)
    with open('github.html', 'w') as f:
        f.write(r.text)


if __name__ == '__main__':
    login()


别人的案例
import requests
from lxml import etree


class Login(object):
    def __init__(self):
        self.headers = {
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
            'Host': 'github.com'
        }
        self.login_url = 'https://github.com/login'
        self.post_url = 'https://github.com/session'
        self.logined_url = 'https://github.com/settings/profile'
        self.session = requests.Session()


    def token(self):
        response = self.session.get(self.login_url, headers=self.headers)
        selector = etree.HTML(response.text)
        token = selector.xpath('//input[1]/@value')[0]
        return token

    def login(self, email, password):
        post_data = {
            'commit': 'Sign in',
            'utf8': '✓',
            'authenticity_token': self.token(),
            'login': email,
            'password': password
        }
        response = self.session.post(self.post_url, data=post_data, headers=self.headers)
        if response.status_code == 200:
            self.dynamics(response.text)
        response = self.session.get(self.logined_url, headers=self.headers)
        if response.status_code == 200:
            self.profile(response.text)

    def dynamics(self, html):
        selector = etree.HTML(html)
        dynamics = selector.xpath('//div[contains(@class, "news")]//div[contains(@class, "alert")]')
        for item in dynamics:
            dynamic = ' '.join(item.xpath('.//div[@class="title"]//text()')).strip()
            print(dynamic)

    def profile(self, html):
        selector = etree.HTML(html)
        name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]
        email = selector.xpath('//select[@id="user_profile_email"]/option[2]/@value')[0]
        # 能正确显示自己账号的信息即为成功
        print(name, email)


if __name__ == "__main__":
    login = Login()
    login.login(email='账号', password='密码')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-2 23:26:47 | 显示全部楼层
suchocolate 发表于 2021-9-2 11:49
data不用考虑那么多参数:

刚开始  只是说 要 写刷新后变化的项
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-3 00:56:32 | 显示全部楼层
suchocolate 发表于 2021-9-1 07:29
贴一下你的代码。

远程主机强迫关闭了一个现有的连接  这种有没有好的避免方法呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-3 09:57:11 | 显示全部楼层
我爱l两条柴 发表于 2021-9-3 00:56
远程主机强迫关闭了一个现有的连接  这种有没有好的避免方法呢?

操作太快了,time.sleep一会,或重启py
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-7 20:17:10 | 显示全部楼层
爬虫入门,模拟登录github时遇到了timestamp和timestamp_secret,哈哈哈哈我遇到了同样的问题,然后搜索到了你的问题。握个爪!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 21:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表