使用Golang selenium WebDriver 自动登录微博
🕙 by pyList at 2020-03-27 21:07
有时候在Golang 程序里需要读取微博的某个页面内容,提示需要登录。最简单的方法是在浏览器里登录后,直接复制Cookie 的内容,然后 http 请求带上Cookie。这样会有人工介入,不是很方便,这里借用 selenium WebDriver 来打开微博登录页面,然后自动填入用户名与密码。
Golang 实现登录信息填充
这前提需要对 selenium WebDriver 有一定了解,下面是主要代码,目的是取到登录后的Cookie
func getCookieStr(usernameText string, passwordText string) (cookieStr string) {
var (
driverPath = "chromedriver"
port = 9222
)
service, err := selenium.NewChromeDriverService(driverPath, port, []selenium.ServiceOption{}...)
if nil != err {
fmt.Println("start a chromedriver service failed", err.Error())
return
}
defer func() {
_ = service.Stop()
}()
// Connect to the WebDriver instance running locally.
caps := selenium.Capabilities{"browserName": "chrome"}
//禁止图片加载,加快渲染速度
imagCaps := map[string]interface{}{
"profile.managed_default_content_settings.images": 2,
}
chromeCaps := chrome.Capabilities{
Prefs: imagCaps,
Path: "",
Args: []string{
"--headless",
"--no-sandbox",
"--disable-gpu-sandbox",
"--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36",
},
}
//以上是设置浏览器参数
caps.AddChrome(chromeCaps)
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
if err != nil {
fmt.Println("connect to the webDriver failed", err.Error())
return
}
defer func() {
_ = wd.Quit()
}()
err = wd.Get("https://passport.weibo.cn/signin/login?entry=mweibo&r=https://weibo.cn/")
if err != nil {
fmt.Println("get page failed", err.Error())
return
}
err = wd.Wait(Displayed(selenium.ByCSSSelector, "#loginName"))
if err != nil {
fmt.Println(err)
return
}
err = wd.Wait(Displayed(selenium.ByCSSSelector, "#loginPassword"))
if err != nil {
fmt.Println(err)
return
}
err = wd.Wait(Displayed(selenium.ByCSSSelector, "#loginAction"))
if err != nil {
fmt.Println(err)
return
}
username, err := wd.FindElement(selenium.ByCSSSelector, "#loginName")
if err != nil {
fmt.Println("get username failed", err.Error())
return
}
password, err := wd.FindElement(selenium.ByCSSSelector, "#loginPassword")
if err != nil {
fmt.Println("get username failed", err.Error())
return
}
submit, err := wd.FindElement(selenium.ByCSSSelector, "#loginAction")
if err != nil {
fmt.Println("get username failed", err.Error())
return
}
err = username.SendKeys(usernameText)
if err != nil {
fmt.Println(err)
return
}
err = password.SendKeys(passwordText)
if err != nil {
fmt.Println(err)
return
}
err = submit.Click()
if err != nil {
fmt.Println(err)
return
}
err = wd.Wait(func(wdTemp selenium.WebDriver) (b bool, e error) {
tit, err := wdTemp.Title()
if err != nil {
return false, nil
}
if tit != "我的首页" {
return false, nil
}
return true, nil
})
if err != nil {
fmt.Println(err)
return
}
cookieLst, err := wd.GetCookies()
if err != nil {
fmt.Println(err)
return
}
var cookieArr []string
for _, c := range cookieLst {
cookieArr = append(cookieArr, c.Name+"="+c.Value)
}
cookieStr = strings.Join(cookieArr, "; ")
return
}
等待页面元素显示函数:
func Displayed(by, elementName string) func(selenium.WebDriver) (bool, error) {
return func(wd selenium.WebDriver) (ok bool, err error) {
var el selenium.WebElement
el, err = wd.FindElement(by, elementName)
if err != nil {
return
}
ok, err = el.IsDisplayed()
return
}
}
总结
应该使用登录网址 weibo.cn
比较简单,还有一种方案是使用 go http client 模拟请求,但需要做更多的工作,还不如直接使用 WebDriver
方便,如果你的项目中本来就需要开启 WebDriver。
用到的库 https://github.com/tebeka/selenium 46
如果不想用 webDriver 也可以关注这个新库 https://github.com/axiaoxin-com/weibo 50
本文网址: https://pylist.com/t/1585314462 (转载注明出处)
如果你有任何建议或疑问可以在下面 留言
发表第一条评论!
相关推荐
小工具
标签
golang
模版
缓存
方法
app
mac
store
登录
未知
ssh
vps
密钥
requests
xsrf
验证
网站
web
nginx
quic
抢先
正则
字符串
切割
md5
文件
计算
time
timestamp
小结
时间
lru
高效
简单
qq
时隔多年
网页
openwrt
usb
上网卡
共享
网络
硬件加速
ubnt
er
固件
路由
搜索引擎
网址
提交
主动
经验
google
身份验证
authenticator
迁移
手机
debian
ubuntu
编译
python
sqlite
数据库
提速
csv
读写
标准
gmail
smtp
发信
密码
开通
虚拟机
virtualbox
很慢
解决
u盘
diskutil
格式化
顽固
failed
load
devtools
sourcemap
chrome
send
mail
sae
注意
发送
coroutine
tornado
yield
例子
一个
静音
风扇
主机
笔记本
改造
低功耗
爬虫
服务器
组装
自动更新
microsoft
关闭
微信
尝鲜
视频
体验
cpu
查看
温度
server
浏览
webdriver
微博
selenium
gnu
linux
安装
系统启动
宅家
坑记
屏幕
动手
最近发表
- Chrome 控制台 DevTools failed to load SourceMap 警告的消除方法
- Mac 关闭 Microsoft 自动更新
- Mac 登录 App Store 出现“发生了未知错误”的解决方法
- 老笔记本改造为无风扇静音主机方案
- 自己组装21瓦低功耗家庭爬虫、文件、web服务器
- 微信视频号尝鲜体验
- Ubuntu/Debian 查看CPU温度的方法
- 在Ubuntu/debian Server 系统使用Chrome 无头浏览模式
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- 使用Golang selenium WebDriver 自动登录微博
- 在 Ubuntu 或其它 GNU/Linux 系统下安装 Debian
- Mac 下制作 USB ubuntu/debian 系统启动、安装盘的几种方法
- ubuntu/debian 下自行编译 OpenWRT 固件
- 宅家自己动手换手机屏幕掉坑记
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- 在 Nginx 和 Golang web 上抢先体验 QUIC
最近浏览
- Openwrt 使用USB 4G 上网卡共享网络
- 路由 UBNT ER-X 官方固件升级及开启硬件加速的方法
- 向各搜索引擎主动提交网址的经验
- 换手机后 Google 身份验证器 Google Authenticator 数据迁移的简单方法
- ubuntu/debian 下自行编译 OpenWRT 固件
- python SQLite 数据库提速经验
- python 标准库读写CSV 文件
- 使用Gmail smtp发信,开通专用密码的方法
- VirtualBox 虚拟机里网络很慢的解决方法
- 在终端使用Mac diskutil 命令格式化顽固U盘
- Chrome 控制台 DevTools failed to load SourceMap 警告的消除方法
- SAE python 使用send_mail 应注意的小问题
- SAE Python 上使用Gmail 发送Mail 的小问题
- 一个tornado+coroutine+yield的例子
- 老笔记本改造为无风扇静音主机方案
- 自己组装21瓦低功耗家庭爬虫、文件、web服务器