您正在查看: Other-新手教程 分类下的文章

auth-通过 oauth2、直接和电子邮件进行身份验证

该库提供 Github、Google、Facebook、Microsoft、Twitter、Yandex、Battle.net、Apple、Patreon 和 Telegram 的“社交登录”,以及自定义身份验证提供商和电子邮件验证。

  • 可以同时使用多个 oauth2 提供程序
  • 特殊dev供应商允许本地测试和开发
  • JWT 存储在具有 XSRF 保护的安全 cookie 中。Cookie 可以是仅限会话的
  • 最小范围仅包含用户名、ID 和图片(头像)
  • 使用用户提供的凭证检查器直接进行身份验证
  • 使用用户提供的发件人(电子邮件、即时通讯等)验证身份验证
  • 自定义 oauth2 服务器并能够使用任何第三方提供商
  • 集成头像代理与 FS、boltdb 和 gridfs 存储
  • 支持用户自定义头像存储
  • 默认头像的 Identicon
  • 带有用户定义验证器的黑名单
  • 支持多个受众
  • 可定制的安全密钥SecretReader
  • 能够将额外信息存储到令牌中并在登录时检索
  • 预授权和后身份验证挂钩来处理自定义用例。
  • 可轻松集成到 http 路由器的中间件
  • 从请求中提取用户信息的包装器
  • 基于角色的访问控制

https://github.com/go-pkgz/auth

获取用户真正转发了某个twitter

import tweepy

# 你的Twitter API Key
consumer_key = 'your_consumer_key'
consumer_secret = 'your_consumer_secret'
access_token = 'your_access_token'
access_token_secret = 'your_access_token_secret'

# 设置API访问
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

# 检查用户是否转发了推文
def check_retweet(username, tweet_id):
    try:
        # 获取用户的转发列表
        retweets = api.retweets(tweet_id)
        for retweet in retweets:
            if retweet.user.screen_name == username:
                return True
        return False
    except tweepy.TweepError as e:
        print(f"Error: {e}")
        return False

# 使用示例
username = 'example_user'
tweet_id = '1234567890123456789'  # 你的推文ID
is_retweeted = check_retweet(username, tweet_id)
print(f"{username} has {'retweeted' if is_retweeted else 'not retweeted'} the tweet.")

https://developer.x.com/en/docs/twitter-api/tweets/retweets/introduction
https://developer.twitter.com/apitools/api?endpoint=%2F2%2Fusers%2F%7Bid%7D%2Fretweets&method=post

Git 修改.Submodule文件 url 生效

  1. 修改 .gitmodules 文件中对应模块的url属性;
  2. 使用 git submodule sync 命令,将新的URL更新到文件.git/config;
  3. 再使用命令初始化子模块:git submodule init
  4. 最后使用命令更新子模块:git submodule update

Windows WSL Goland 开发环境部署

对于Windows WSL的安装和对应镜像安装此片不做具体介绍,本篇文章只介绍Goland配置
首先Goland 打开相应代码项目后

通过菜单 File->Settings
打开Settings设置

Run Targets配置

打开Run Targets配置

然后添加 WSL

选择自己本地对应的WSL

根据自己WSL镜像中的go配置,选择对应的目录

然后修改编辑当前编译项目配置,选择前面设置的Targets

最后保存即可在WSL编译项目了

Go sync.WaitGroup的用法

介绍

经常会看到以下了代码:

package main

import (
    "fmt"
    "time"
)

func main(){
    for i := 0; i < 100 ; i++{
        go fmt.Println(i)
    }
    time.Sleep(time.Second)
}

主线程为了等待goroutine都运行完毕,不得不在程序的末尾使用time.Sleep() 来睡眠一段时间,等待其他线程充分运行。对于简单的代码,100个for循环可以在1秒之内运行完毕,time.Sleep() 也可以达到想要的效果。

但是对于实际生活的大多数场景来说,1秒是不够的,并且大部分时候我们都无法预知for循环内代码运行时间的长短。这时候就不能使用time.Sleep() 来完成等待操作了。

可以考虑使用管道来完成上述操作:

func main() {
    c := make(chan bool, 100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            c <- true
        }(i)
    }

    for i := 0; i < 100; i++ {
        <-c
    }
}

首先可以肯定的是使用管道是能达到我们的目的的,而且不但能达到目的,还能十分完美的达到目的。

但是管道在这里显得有些大材小用,因为它被设计出来不仅仅只是在这里用作简单的同步处理,在这里使用管道实际上是不合适的。而且假设我们有一万、十万甚至更多的for循环,也要申请同样数量大小的管道出来,对内存也是不小的开销。

对于这种情况,go语言中有一个其他的工具sync.WaitGroup 能更加方便的帮助我们达到这个目的。

WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,wait() 会阻塞代码的运行,直到计数器地值减为0。

使用WaitGroup 将上述代码可以修改为:

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

这里首先把wg 计数设置为100, 每个for循环运行完毕都把计数器减一,主函数中使用Wait() 一直阻塞,直到wg为零——也就是所有的100个for循环都运行完毕。相对于使用管道来说,WaitGroup 轻巧了许多。

注意事项

1. 计数器不能为负值

我们不能使用Add() 给wg 设置一个负值,否则代码将会报错:

panic: sync: negative WaitGroup counter

goroutine 1 [running]:
sync.(*WaitGroup).Add(0xc042008230, 0xffffffffffffff9c)
    D:/Go/src/sync/waitgroup.go:75 +0x1d0
main.main()
    D:/code/go/src/test-src/2-Package/sync/waitgroup/main.go:10 +0x54

同样使用Done() 也要特别注意不要把计数器设置成负数了。

2. WaitGroup对象不是一个引用类型

WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址:

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go f(i, &wg)
    }
    wg.Wait()
}

// 一定要通过指针传值,不然进程会进入死锁状态
func f(i int, wg *sync.WaitGroup) { 
    fmt.Println(i)
    wg.Done()
}

转载自:https://blog.csdn.net/u013474436/article/details/88749749