小编Lia*_*iam的帖子

Python 的请求会触发 Cloudflare 的安全性,而 urllib 不会

我正在为一家餐厅网站开发自动网络爬虫,但遇到了问题。所述网站使用 cloudlfare 的反机器人安全,我想绕过它,不是攻击模式,而是仅在检测到非美国 IP 或机器人时触发的验证码测试。我试图绕过它,因为当我清除 cookie、禁用 javascript 或当我使用美国代理时,cloudflare 的安全性不会触发。

知道了这一点,我尝试使用 python 的请求库:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
response = requests.get("https://grimaldis.myguestaccount.com/guest/accountlogin", headers=headers).text
print(response)
Run Code Online (Sandbox Code Playgroud)

但这最终会触发 Cloudflare,无论我使用什么代理。

但是,当使用具有相同标头的 urllib.request 时:

import urllib.request
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
request = urllib.request.Request("https://grimaldis.myguestaccount.com/guest/accountlogin", headers=headers)
r = urllib.request.urlopen(request).read()
print(r.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

当使用相同的美国 IP 运行时,这次它不会触发 Cloudflare 的安全性,即使它使用与请求库相同的标头和 IP。

因此,我试图找出不在 urllib 库中的请求库中究竟是什么触发了 cloudflare。

虽然典型的答案是“然后只使用 urllib”,但我想弄清楚请求到底有什么不同,以及我如何解决它,首先要了解请求的工作原理和 cloudflare 检测机器人的方式,但也是如此我可以将我能找到的任何修复应用到其他 httplib(特别是异步的)

编辑 N°2:到目前为止的进展:

感谢@TuanGeek,我们现在可以使用请求绕过 cloudflare 块,只要我们直接连接到主机 IP …

python web-scraping python-3.x python-requests

13
推荐指数
2
解决办法
7388
查看次数

使用Python在Flask中进行Hmac验证(在PHP和RUBY中进行引用)

大家好,我一直在为Selly.gg商家网站开发一种使用flask用python实现HMAC验证的方法。

因此,sellery的开发人员文档提供了以下示例,以验证HMAC签名(在PHP和ruby中):https : //developer.selly.gg/? php#signing-validating (以下代码:)

PHP:

<?php
        $signature = hash_hmac('sha512', json_encode($_POST), $secret);
        if hash_equals($signature, $signatureFromHeader) {
            // Webhook is valid 
        }
?>
Run Code Online (Sandbox Code Playgroud)

红宝石:

signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha512'), secret, payload.to_json)
is_valid_signature = ActiveSupport::SecurityUtils.secure_compare(request.headers['X-Selly-Signature'], signature)
Run Code Online (Sandbox Code Playgroud)

因此,到目前为止,我能弄清楚的是:它们不使用base64进行编码(如shopify等),它使用SHA-512,将秘密代码与json响应数据一起进行编码,最后请求标头为'X-Selly -签名'

到目前为止,我已经完成了以下代码(基于shopify的HMAC签名https://help.shopify.com/en/api/getting-started/webhooks代码):

SECRET = "secretkeyhere"
def verify_webhook(data, hmac_header):
    digest = hmac.new(bytes(SECRET, 'ascii'), bytes(json.dumps(data), 'utf8'), hashlib.sha512).hexdigest()
    return hmac.compare_digest(digest, hmac_header)
try:
    responsebody = request.json #line:22
    status = responsebody['status']#line:25
except Exception as e:
    print(e)
    return not_found()
print("X Selly sign: " + request.headers.get('X-Selly-Signature'))
verified = verify_webhook(responsebody, request.headers.get('X-Selly-Signature')) …
Run Code Online (Sandbox Code Playgroud)

php python hmac flask python-3.x

5
推荐指数
1
解决办法
153
查看次数

将ascii字符串转换为base64而不使用"b"和引号

我想将ascii字符串(确切地说是文本)转换为base64.所以我知道如何做到这一点,我只使用以下代码:

import base64
string = base64.b64encode(bytes("string", 'utf-8'))
print (string)
Run Code Online (Sandbox Code Playgroud)

哪能给我

b'c3RyaW5n'
Run Code Online (Sandbox Code Playgroud)

但问题是,我希望它只是打印

c3RyaW5n
Run Code Online (Sandbox Code Playgroud)

是否可以打印不带"b"和"引号"的字符串?谢谢!

python base64 python-3.x

4
推荐指数
2
解决办法
3757
查看次数

以编程方式更改监视器输入源

我最近偶然发现了这个软件: https: //clickmonitorddc.bplaced.net/ 我想找到一种方法来以编程方式更改我的默认显示器的输入源(从 DP 到 HDMI 并返回)(在我的两个显示器中的第一个上)。

我发现这个Sending DDC/CI Commands to Monitor on Windows using Python? 详细介绍如何通过 python 发送 ddc-ci 命令。

Now this is all well and good, but the linked pdf file to the list of DDC commands has expired and I can't seem to figure out how I'd apply this to my specific case. Messing around has only resulted in me succesfully making my monitors go blank one after the other, but that's not really what …

python multiple-monitors python-3.x

3
推荐指数
1
解决办法
8917
查看次数

我怎么能用三重奏异步读取文件的特定行

所以我想用三重奏(异步)打开文件,然后由于文件很大,读取它的单个特定行

所以在“普通”同步 python 中,我会做这样的事情:

with open("text.txt") as f:
    for i, line in enumerate(f):
        if i == 3:
            print(line)
Run Code Online (Sandbox Code Playgroud)

这将打印文件第二行的内容

现在的问题是,当使用 trio 的 open_file 方法时,enumerate(f)返回错误: TypeError: 'AsyncIOWrapper' object is not iterable

并遵循文档:

async with await trio.open_file("text.txt") as f:
    async for i, line in f:
        print(i)
        print(line)
Run Code Online (Sandbox Code Playgroud)

只会为 i 返回该行的值,而对于该行只返回空格

那么,如何使用三重奏/异步来读取大文件的特定行而不会丢失太多内存?

python asynchronous python-3.x python-trio

1
推荐指数
1
解决办法
239
查看次数