我是靠谱客的博主 名字长了才好记,最近开发中收集的这篇文章主要介绍golang利用chromedp库显式手动登录后自动获取接口数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

为了让用户在Chromium浏览器中手动登录新浪微博,然后继续自动化操作,我们可以利用chromedp库,启动一个显式的Chromium浏览器,暂停操作让用户手动登录,完成登录后再继续自动化抓取微博数据的流程。具体的流程如下:

流程概述:

  1. 启动Chromium浏览器。

  2. 导航到新浪微博登录页面,让用户手动登录。

  3. 等待用户登录完成。

  4. 获取登录后的Cookie。

  5. 使用获取到的Cookie进行后续的API数据抓取。

核心改动点:

  • 使用显式浏览器(非无头模式)让用户手动登录。

  • 通过暂停执行代码等待用户完成登录。

  • 登录完成后,通过chromedp获取Cookie。

下面是实现该功能的完整代码:

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"

	"github.com/chromedp/chromedp"
)

// 定义微博接口返回的结构体
type WeiboResponse struct {
	Data []struct {
		ID   string `json:"id"`
		Text string `json:"text"`
	} `json:"data"`
}

// 启动Chromium手动登录并获取Cookie
func getCookiesAfterManualLogin() (string, error) {
	// 创建Chromium浏览器上下文,显式启动浏览器
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		// 显示浏览器
		chromedp.Flag("headless", false),
		// 窗口大小
		chromedp.WindowSize(1200, 900),
	)

	allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
	defer cancel()

	// 创建Chromedp上下文
	ctx, cancel := chromedp.NewContext(allocCtx)
	defer cancel()

	// 设置执行上下文超时控制
	ctx, cancel = context.WithTimeout(ctx, 120*time.Second)
	defer cancel()

	// 打开微博登录页面
	if err := chromedp.Run(ctx, chromedp.Navigate(`https://weibo.com/login.php`)); err != nil {
		return "", fmt.Errorf("无法打开微博登录页面: %v", err)
	}

	// 提示用户手动登录
	fmt.Println("请手动登录新浪微博...")

	// 等待手动登录完成,可以根据实际情况调整超时时间
	time.Sleep(30 * time.Second)

	// 获取登录成功后的Cookie
	var cookies string
	err := chromedp.Run(ctx, chromedp.Evaluate(`document.cookie`, &cookies))
	if err != nil {
		return "", fmt.Errorf("获取cookie失败: %v", err)
	}

	fmt.Println("登录成功,获取到的Cookie: ", cookies)

	return cookies, nil
}

// 使用Cookie请求抓取微博API数据
func fetchWeibo(uid string, page int, cookie string) (*WeiboResponse, error) {
	// 构建URL
	url := fmt.Sprintf("https://weibo.com/ajax/statuses/mymblog?uid=%s&page=%d&feature=0", uid, page)

	// 创建一个HTTP客户端,设置超时
	client := &http.Client{
		Timeout: 10 * time.Second,
	}

	// 创建HTTP请求
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}

	// 模拟浏览器请求头
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
	req.Header.Set("Referer", "https://weibo.com/")
	req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")
	req.Header.Set("Cookie", cookie) // 使用手动登录获取到的Cookie

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	// 打印原始响应,便于调试
	// fmt.Println(string(body))

	// 解析JSON数据
	var weiboResp WeiboResponse
	if err := json.Unmarshal(body, &weiboResp); err != nil {
		return nil, err
	}

	return &weiboResp, nil
}

func main() {
	// 启动Chromium手动登录并获取cookie
	cookie, err := getCookiesAfterManualLogin()
	if err != nil {
		log.Fatalf("获取cookie失败: %v", err)
	}

	uid := "7839005930" // 新浪微博用户ID
	page := 1           // 要抓取的页面

	// 使用获取到的Cookie抓取微博API数据
	weiboData, err := fetchWeibo(uid, page, cookie)
	if err != nil {
		log.Fatalf("抓取数据失败: %v", err)
	}

	// 打印抓取到的数据
	for _, post := range weiboData.Data {
		fmt.Printf("ID: %s, 内容: %s\n", post.ID, post.Text)
	}
}

代码解读:

  1. 显式启动Chromium

    • 通过chromedp.ExecAllocator配置显式浏览器启动,chromedp.Flag("headless", false)用于禁用无头模式,这样浏览器窗口会显示出来,允许用户手动操作。

    • chromedp.WindowSize(1200, 900)指定浏览器窗口的大小。

  2. 手动登录

    • 浏览器启动后,打开新浪微博的登录页面。然后程序暂停(使用time.Sleep)等待用户手动登录。

    • 这里使用了time.Sleep(30 * time.Second)暂停30秒,可以根据实际情况调整时间。如果页面有进一步的跳转或验证码验证,可能需要等待更长时间。

  3. 获取Cookie

    • 用户手动登录成功后,程序通过chromedp.Evaluate获取浏览器上下文中的Cookie。

    • document.cookie返回的是当前页面的Cookie字符串,随后可以用它来发起后续的API请求。

  4. 抓取API数据

    • 获取到Cookie后,通过fetchWeibo函数进行API请求,模拟正常用户请求获取微博数据。

使用说明:

  1. 手动登录:当程序提示“请手动登录新浪微博...”时,用户需要手动完成登录流程。包括输入用户名、密码以及可能的验证码。

  2. 延长登录等待时间:默认的等待时间是30秒。你可以根据实际情况修改time.Sleep的时间,确保有足够的时间来完成登录。

  3. 保存Cookie:如果需要保存Cookie以便下次重用,可以将获取到的Cookie存储到本地文件中。

注意事项:

  • 验证码问题:如果微博登录过程中出现了验证码,用户需要手动解决。程序会暂停等待用户操作。

  • 频率限制:微博可能会对抓取请求的频率进行限制,请根据实际情况控制请求频率,避免触发反爬虫机制。


最后

以上就是名字长了才好记为你收集整理的golang利用chromedp库显式手动登录后自动获取接口数据的全部内容,希望文章能够帮你解决golang利用chromedp库显式手动登录后自动获取接口数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(203)

评论列表共有 0 条评论

立即
投稿
返回
顶部