Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
見的登錄方式有以下兩種:
上面只是簡單的描述,下面是詳細的針對兩種登錄方式的時候爬蟲的處理方法
第一種情況
這種例子其實也比較多,現在很多網站的登錄都是第一種的方法,這里通過以github為例子:
分析頁面
獲取authenticity_token信息
我們都知道登錄頁面這里都是一個form表單提交,我可以可以通過谷歌瀏覽器對其進行分析
如上圖我們找到了這個token信息
所以我們在登錄之前應該先通過代碼訪問這個登錄頁面獲取這個authenticity_token信息
獲取登陸頁面的cookie信息
set-cookie這里是登錄頁面的cookie
分析登錄包獲取提交地址
當我們輸入用戶名和密碼之后點擊提交,我們可以從包里找到如上圖的地址,就是post請求提交form的信息
請求的地址:https://github.com/session
請求的參數有:
"commit": "Sign in",
"utf8":"?",
"authenticity_token":“KM6Q0mM9FtI95wYsI/WU3BnaMbYrmV60c0YTQlZjBuAuYa193LP2Gd8BTCmQBSFvPFZRlk3/1TFOnOgGUdy7Ig==”,
"login":"hjzhaofan@163.com",
"password":"123"
從這里我們也可以看出提交參數中的“authenticity_token”,而這個參數就是需要我們從登陸頁面先獲取到。
當我們登錄成功后:
再次訪問github,這個時候cookie里就增加了兩個cookie信息,而這個信息是登錄后在增加的信息
所以如果我們想要通過程序登錄,我們就需要在登錄成功后再次獲取cookie信息
然后通過這個cookie去訪問我們github的其他信息例如我們的個人信息設置頁面:
https://github.com/settings/profile
代碼實現
下面代碼實現了登錄并訪問https://github.com/settings/repositories
import requests from bs4 import BeautifulSoup Base_URL = "https://github.com/login" Login_URL = "https://github.com/session" def get_github_html(url): ''' 這里用于獲取登錄頁的html,以及cookie :param url: https://github.com/login :return: 登錄頁面的HTML,以及第一次的cooke ''' response = requests.get(url) first_cookie = response.cookies.get_dict() return response.text,first_cookie def get_token(html): ''' 處理登錄后頁面的html :param html: :return: 獲取csrftoken ''' soup = BeautifulSoup(html,'lxml') res = soup.find("input",attrs={"name":"authenticity_token"}) token = res["value"] return token def gihub_login(url,token,cookie): ''' 這個是用于登錄 :param url: https://github.com/session :param token: csrftoken :param cookie: 第一次登錄時候的cookie :return: 返回第一次和第二次合并后的cooke ''' data= { "commit": "Sign in", "utf8":"?", "authenticity_token":token, "login":"你的github賬號", "password":"*****" } response = requests.post(url,data=data,cookies=cookie) print(response.status_code) cookie = response.cookies.get_dict() #這里注釋的解釋一下,是因為之前github是通過將兩次的cookie進行合并的 #現在不用了可以直接獲取就行 # cookie.update(second_cookie) return cookie if __name__ == '__main__': html,cookie = get_github_html(Base_URL) token = get_token(html) cookie = gihub_login(Login_URL,token,cookie) response = requests.get("https://github.com/settings/repositories",cookies=cookie) print(response.text)
第二種情況
這里通過伯樂在線為例子,這個相對于第一種就比較簡單了,沒有太多的分析過程直接發送post請求,然后獲取cookie,通過cookie去訪問其他頁面,下面直接是代碼實現例子:
http://www.jobbole.com/bookmark/ 這個地址是只有登錄之后才能訪問的頁面,否則會直接返回登錄頁面
這里說一下:http://www.jobbole.com/wp-admin/admin-ajax.php是登錄的請求地址這個可以在抓包里可以看到
import requests def login(): url = "http://www.jobbole.com/wp-admin/admin-ajax.php" data = { "action": "user_login", "user_login":"zhaofan1015", "user_pass": '******', } response = requests.post(url,data) cookie = response.cookies.get_dict() print(cookie) url2 ="http://www.jobbole.com/bookmark/" response2 = requests.get(url2,cookies=cookie) print(response2.text) login()
做什么事情都需要不斷地堅持下去,編程也一樣。現在python語言十分火熱,職場對python的需求也很高,薪資待遇都很棒。所以希望大家能夠堅持學習,‘剩’者為王,堅持下來的人才有資格稱王。如果你覺得本文對你的學習有幫助的話,不妨點個關注,我會持續更新。
網上爬取數據的時候通常需要注冊會員,然后登錄才能正常使用或下載數據。這些登錄的信息通常會存放在網站的cookie中。根據百度百科的定義,“Cookie 是一個保存在客戶機中的簡單的文本文件, 這個文件與特定的 Web 文檔關聯在一起, 保存了該客戶機訪問這個Web 文檔時的信息, 當客戶機再次訪問這個 Web 文檔時這些信息可供該文檔使用?!?/p>
為了方便自動化爬取數據,我們可以將網站的登錄信息的cookie存儲在本地文件中,然后下次登錄時,直接加載cookies即可迅速實現登錄。在Python中,獲取網站cookie的辦法有好多種,這里簡單介紹較常用的selenium庫,調用瀏覽器驅動程序獲取最新的cookie,并模擬網站自動登錄。
首先確保python成功安裝了selenium庫,安裝命令如下:
pip install selenium
其次是要安裝對應瀏覽器的驅動程序,一般使用谷歌瀏覽器、火狐瀏覽器和Edge瀏覽器,它們對應的驅動程序分別為chromedriver.exe,geckodriver.exe,msedgedriver.exe,需要下載對應瀏覽器版本的程序。例如我使用的谷歌瀏覽器版本為112.0.5615,我需要下載對應版本的chromedriver.exe。具體安裝教程,可參考鏈接:https://www.bilibili.com/read/cv13873971
一切準備后就可以開始編寫代碼了,這里使用Anaconda的Jupyter編寫運行命令。先導入selenium庫以及json,os庫,selenium用于啟動瀏覽器,json用于將cookie轉存為json格式,os用于將文件保存在本地,time用于強制程序等待若干時間。
from selenium import webdriver
import json,os,time
#選擇保存目錄
outdir = r'F:\MyProject\09Medicine'
#登錄的網址
douban_url = 'https://www.douban.com/'
#啟動瀏覽器
browser = webdriver.Chrome()
#瀏覽器打開網頁
browser.get(douban_url)
#等待30秒時間使你輸入登錄信息
time.sleep(30)
#瀏覽器登錄后獲取cookie
cookies = browser.get_cookies()
#將cookies保存在本地
with open(os.path.join(outdir,'cookies.txt'),mode='w') as f:
f.write(json.dumps(cookies))
#關閉瀏覽器
browser.close()
瀏覽器打開豆瓣網首頁
這樣即可將網站登錄信息保存在當地了。下次登錄時可直接調用本地cookie文件實現自動登錄了。
#打開保存的cookie文件
with open(r'F:\MyProject\09Medicine\cookies.txt',mode='r') as f:
cookies_file = f.read()
#將讀取的文件轉為json格式
cookie_list = json.loads(cookies_file)
#打開瀏覽器
browser = webdriver.Chrome()
#輸入豆瓣網址
page_url = 'https://www.douban.com'
browser.get(page_url)
#網頁加載cookie
for cookie in cookie_list:
browser.add_cookie(cookie)
#需要刷新網頁才能登錄
browser.refresh()
#再輸入一次網址即可顯示登錄成功
browser.get(page_url)
使用cookie登錄的豆瓣網首頁
豆瓣網站的cookie反爬機制做得貌似比較好,一定時間后需要更新登錄的cookie才可重新自動登錄。因此爬取的時候可定期更新cookie信息。
、小程序端調用wx.login
2、判斷用戶是否授權
3、小程序端訪問 wx.getUserInfo
4、小程序端js代碼:+
wx.login({
success: resp => {
// 發送 res.code 到后臺換取 openId, sessionKey, unionId
console.log(resp);
var that = this;
// 獲取用戶信息
wx.getSetting({
success: res => {
if (res.authSetting['scope.userInfo']) {
// 已經授權,可以直接調用 getUserInfo 獲取頭像昵稱,不會彈框
wx.getUserInfo({
success: userResult => {
var platUserInfoMap = {}
platUserInfoMap["encryptedData"] = userResult.encryptedData;
platUserInfoMap["iv"] = userResult.iv;
wx.request({
url: 'http://127.0.0.1:5000/user/wxlogin',
data: {
platCode: resp.code,
platUserInfoMap: platUserInfoMap,
},
header: {
"Content-Type": "application/json"
},
method: 'POST',
dataType:'json',
success: function (res) {
console.log(res)
wx.setStorageSync("userinfo", res.userinfo) //設置本地緩存
},
fail: function (err) { },//請求失敗
complete: function () { }//請求完成后執行的函數
})
}
})
}
}
})
}
})
5、后端服務器訪問code2session,通過code2Session這個api接口來獲取真正需要的微信用戶的登錄態 session_key 和 openid 和 unionid
6、后端服務器校驗用戶信息,對 encryptedData 解密
微信小程序登錄后獲得session_key后,返回了encryptedData,iv的數據,其中encryptedData解密后包含了用戶的信息,解密后的json格式如下:
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
from Crypto.Cipher import AES 這邊一般會遇到 ModuleNotFoundError:No module named "Crypto" 錯誤
(1)執行 pip3 install pycryptodome
(2)如果還是提示沒有該模塊,那就虛擬環境目錄 Lib—-site-package 中查看是否有 Crypto文件夾,這時你應該看到有 crypto 文件夾,將其重命名為 Crypto 即可
import base64
import json
from Crypto.Cipher import AES
class WXBizDataCrypt:
def __init__(self, appId, sessionKey):
self.appId = appId
self.sessionKey = sessionKey
def decrypt(self, encryptedData, iv):
# base64 decode
sessionKey = base64.b64decode(self.sessionKey)
encryptedData = base64.b64decode(encryptedData)
iv = base64.b64decode(iv)
cipher = AES.new(sessionKey, AES.MODE_CBC, iv)
decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)))
if decrypted['watermark']['appid'] != self.appId:
raise Exception('Invalid Buffer')
return decrypted
def _unpad(self, s):
return s[:-ord(s[len(s)-1:])]
8、Flask的 /user/wxlogin api代碼:
import json,requests
from WXBizDataCrypt import WXBizDataCrypt
from flask import Flask
@app.route('/user/wxlogin', methods=['GET','POST'])
def user_wxlogin():
data = json.loads(request.get_data().decode('utf-8')) # 將前端Json數據轉為字典
appID = 'appID' # 開發者關于微信小程序的appID
appSecret = 'appSecret' # 開發者關于微信小程序的appSecret
code = data['platCode'] # 前端POST過來的微信臨時登錄憑證code
encryptedData = data['platUserInfoMap']['encryptedData']
iv = data['platUserInfoMap']['iv']
req_params = {
'appid': appID,
'secret': appSecret,
'js_code': code,
'grant_type': 'authorization_code'
}
wx_login_api = 'https://api.weixin.qq.com/sns/jscode2session'
response_data = requests.get(wx_login_api, params=req_params) # 向API發起GET請求
resData = response_data.json()
openid = resData ['openid'] # 得到用戶關于當前小程序的OpenID
session_key = resData ['session_key'] # 得到用戶關于當前小程序的會話密鑰session_key
pc = WXBizDataCrypt(appID, session_key) #對用戶信息進行解密
userinfo = pc.decrypt(encryptedData, iv) #獲得用戶信息
print(userinfo)
'''
下面部分是通過判斷數據庫中用戶是否存在來確定添加或返回自定義登錄態(若用戶不存在則添加;若用戶存在,返回用戶信息)
--------略略略略略略略略略-------------
這部分我就省略啦,數據庫中對用戶進行操作
'''
return json.dumps
({
"code": 200, "msg": "登錄成功","userinfo":userinfo}, indent=4, sort_keys=True, default=str, ensure_ascii=False)
到此這篇關于Python Flask微信小程序登錄詳解及登錄api實現的文章就介紹到這了,更多相關Python Flask微信小程序登錄詳解及登錄api實現內容請搜索我們以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持我們!
時間:2020-06-05
用戶資料頁面 在用戶資料頁面,基本上沒有什么特別要強調和介紹的新概念.只需要創建一個含有HTML的新視圖函數模板頁面即可. 下面是視圖函數(項目目錄/views.py): @app.route('/user/<nickname>') @login_required def user(nickname): user = User.query.filter_by(nickname = nickname).first() if user == None: flash('不存在用戶:' + nickn
前言: 近期需要開發一個打分的微信小程序,涉及到與后臺服務器的數據交互,因為業務邏輯相對簡單,故選擇Python的輕量化web框架Flask來搭建后臺程序.因為是初次接觸小程序,經過一番摸索和嘗試,個人覺得的微信小程序與后臺的交互有點像ajax,所以有ajax開發經驗的同學開發小程序應該很容易上手,因為本文著重講解后臺程序的搭建,所以,微信小程序的前端開發將一筆帶過,有興趣學習小程序前端語言的同學可移步網易云課堂的一套快速入門課程<輕松玩轉微信小程序>. 分三步講解微信小程序與Python后臺
表單是讓用戶與我們的網頁應用程序交互的基本元素.Flask 本身并不會幫助我們處理表單,但是 Flask-WTF 擴展讓我們在我們的 Flask 應用程序中使用流行的 WTForms 包.這個包使得定義表單和處理提交容易一些. Flask-WTF 我們想要使用 Flask-WTF 做的第一件事情(在安裝它以后,GitHub項目頁:https://github.com/lepture/flask-wtf )就是在 myapp.forms 包中定義一個表單. # ourapp/forms.py fr
回顧 在前面的系列章節中,我們創建了一個數據庫并且學著用用戶和郵件來填充,但是到現在我們還沒能夠植入到我們的程序中. 兩章之前,我們已經看到怎么去創建網絡表單并且留下了一個實現完全的登陸表單. 在這篇文章中,我們將基于我門所學的網絡表單和數據庫來構建并實現我們自己的用戶登錄系統.教程的最后我們小程序會實現新用戶注冊,登陸和退出的功能. 為了能跟上這章節,你需要前一章節最后部分,我們留下的微博程序.請確保你的程序已經正確安裝和運行. 在前面的章節,我們開始配置我們將要用到的Flask擴展.為了登
用到的一些知識點:Flask-SQLAlchemy.Flask-Login.Flask-WTF.PyMySQL 這里通過一個完整的登錄實例來介紹,程序已經成功運行,在未登錄時攔截了success.html頁面跳轉到登錄頁面,登錄成功后才能訪問success. 以下是項目的整體結構圖: 首先是配置信息,配置了數據庫連接等基本的信息,config.py DEBUG = True SQLALCHEMY_ECHO = False SQLALCHEMY_DATABASE_URI = 'mysql+pymy
一.概述 公司需要通過網頁用戶認證登錄實現上網,網絡設備判斷當前帳號12小時沒有沒上網將會自動斷開帳號上網,每天早上上班第一件事就是打開用戶認證網頁輸入. 用戶名與密碼,有時候要家里通過teamview遠程控制軟件連接公司電腦,想讓公司電腦24小時在線,最后通過python實現了自動登錄. 代碼: #_*_ coding:utf-8 _*_ import requests,time s=requests.session() data = [ ('opr', 'pwdLogin'), ('user
Python操作Mysql 最近在學習python,這種腳本語言毫無疑問的會跟數據庫產生關聯,因此這里介紹一下如何使用python操作mysql數據庫.我python也是零基礎學起,所以本篇博客針對的是python初學者,大??梢赃x擇繞道. 另外,本篇基于的環境是Ubuntu13.10,使用的python版本是2.7.5. MYSQL數據庫 MYSQL是一個全球領先的開源數據庫管理系統.它是一個支持多用戶.多線程的數據庫管理系統,與Apache.PHP.Linux共同組成LAMP平臺,在web應
用python編寫數據庫的代碼很方便,但是如果不想自己寫sql語句,其實還有更多的討巧辦法.使用webpy的db庫就是不錯的一個選擇.當然為了使用webpy的db,之前你還需要安裝MySQLdb,其他的就不需要做什么了. 1.安裝MySQLdb庫 sudo apt-get install python-MySQLdb 2.安裝webpy sudo apt-get install python-webpy 3.連接數據庫 import web db = web.database(dbn='mysq
SQLAlchemy是Python編程語言下的一款開源軟件,提供了SQL工具包及對象關系映射(ORM)工具,使用MIT許可證發行.SQLAlchemy首次發行于2006年2月,并迅速地在Python社區中最廣泛使用的ORM工具之一,不亞于Django的ORM框架. 本文將介紹如何使用SQLAlchemy操作MySQL,完成基礎的表創建,表格數據的新增.查詢.修改.刪除(CRUD)等操作. 首先我們需要確認當前的Python環境下已經安裝sqlalchemy和pymysql模塊. 新建表格 我們使
最近剛剛開始學習mysql,所以就寫了這個很基本的用戶注冊登錄的功能來練練手.雖然這個很簡單,但是我還是看到了自己學習的進步,很開心.哈哈哈. 這里要注意數據表的建立: 直接上代碼吧,里面注釋很詳細了. package client; import java.sql.*; import java.util.*; public class Client { /** * 用以實現用戶的注冊和登錄 */ private static String username;//用戶登錄注冊的姓名 privat
Blog Posts的提交 讓我們從簡單的開始.首頁上必須有一張用戶提交新的post的表單. 首先我們定義一個單域表單對象(fileapp/forms.py): class PostForm(Form): post = TextField('post', validators = [Required()]) 下面,我們把這個表單添加到template中(fileapp/templates/index.html): <!-- extend base layout --> {% extends &
本文實例講述了flask 框架操作MySQL數據庫.分享給大家供大家參考,具體如下: 一.創建數據庫表格 """ Created on 19-10-8 @requirement:Anaconda 4.3.0 (64-bit) Python3.6 @description:創建表格 """ import pymysql server = '127.0.0.1' user = 'root' password = 'password' # 連接數據庫
1. MySQLdb 的使用 (1) 什么是MySQLdb? MySQLdb 是用于 Python 連接 MySQL 數據庫的接口,它實現了 Python 數據庫 API 規范 V2.0,基于 MySQL C API 上建立的. (2) 源碼安裝 MySQLdb: https://pypi.python.org/pypi/MySQL-python $ tar zxvf MySQL-python-*.tar.gz $ cd MySQL-python-* $ python setup.py buil
*請認真填寫需求信息,我們會在24小時內與您取得聯系。