我正在做一个项目,想在其中集成一个绕过验证码的功能。我一直在为此使用 2captcha 服务,而且它一直很成功,直到我从 Windows 切换到 Linux(Ubu...
我正在开发一个项目,想要集成一个验证码绕过功能。我一直在为此使用 2captcha 服务,在我从 Windows 切换到 Linux(Ubuntu 22.04)之前,它一直很成功。当 我尝试运行此功能时,我不断 “TwoCaptcha”对象没有属性“normal”
def solve_captcha(image_path):
solver = TwoCaptcha(api_key)
try:
result = solver.normal(image_path)
except Exception as e:
logging.error(e)
else:
return result['code']
问题是,我在两个系统上安装了相同的库版本。转换后,我没有更改上述函数代码中的任何内容,官方文档在其示例中包含了该属性。
有人能帮助我理解这个问题吗?
我尝试搜索:库文档( https://pypi.org/project/2captcha-python/ )以及官方服务网页上的示例( https://2captcha.com/api-docs/normal-captcha ),但它们的代码中都包含“正常”属性。
为了简化答案,假设。
快速扫描 OA 输入数据似乎表明这些因素成立。但如果数据发生变化,您将需要重新验证。
注意:扫描通用 CSV 文件时,这些条件可能不成立,因此您应该使用真正的解析器。但具有这些条件的良好 CSV 文件应该足够了。
我会把这个问题分成两个问题。
因此我会这样做:
注意:未经代码审查,因此可能存在一些错误。请通过测试进行验证。
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
struct Value
{
std::string value;
friend std::ostream& operator<<(std::ostream& s, Value const& data)
{
s << data.value;
return s;
}
friend std::istream& operator>>(std::istream& s, Value& data)
{
// assumes cell ends with a ',' or eof
// Will remove the trailing ',' from the stream but not include it in the data
// If cell is quoted (") then removes quotes does not add them to the data.
// Assumes quotes are first and last character in cell.
char peek = s.peek();
if (peek != '"') {
std::getline(s, data.value, ','); // drops trailing comma
}
else {
char get1 = s.get(); // gets leading quote
std::getline(s, data.value, '"'); // drops tailing quote
char get2 = s.get(); // gets trailing comma
}
return s;
}
};
struct Line
{
std::vector<Value> values;
friend std::ostream& operator<<(std::ostream& s, Line const& data)
{
for (auto const& v: data.values) {
s << v << ",";
}
return s;
}
friend std::istream& operator>>(std::istream& s, Line& data)
{
// assumes we can get a line of data with std::getline
// All the data is in chunks of Value.
std::string line;
if (std::getline(s, line)) {
std::stringstream lineStream(std::move(line));
std::vector<Value> tmp{std::istream_iterator<Value>{lineStream}, std::istream_iterator<Value>{}};
data.values = std::move(tmp);
}
return s;
}
};
int main()
{
std::ifstream csv("EbayPcLaptopsAndNetbooksUnclean.csv");
Line line;
int count = 0;
int lineSizeCount[1000] = {0};
while(csv >> line) {
++count;
++lineSizeCount[line.values.size()];
}
std::cout << "Lines: " << count << "\n";
for (int loop = 0; loop < 1000; ++loop) {
if (lineSizeCount[loop] != 0) {
std::cout << " Size: " << loop << " => " << lineSizeCount[loop] << "\n";
}
}
}