qqbot é um robô QQ implementado em python e baseado no protocolo SmartQQ da Tencent. Ele pode ser executado em plataformas Linux, Windows e Mac OSX.
O endereço github deste projeto: https://github.com/pandolia/qqbot
Você pode fazer isso estendendo o qqbot:
Para uso em Python 2.7/3.4+, instale com pip:
pip install qqbot
Ou baixe o código-fonte, descompacte-o, faça cd no diretório e execute: pip install
.
Digite: qqbot na linha de comando para iniciar um QQBot.
Durante o processo de inicialização, uma imagem de código QR aparecerá automaticamente. Você precisa usar o cliente QQ móvel para escanear o código e autorizar o login. Após a inicialização bem-sucedida, as informações de login serão salvas em um arquivo local. Na próxima vez, você pode inserir: qqbot -q qq number . Primeiro, tente restaurar as informações de login do arquivo local (não há necessidade de digitalizar o código manualmente). . Apenas a recuperação falha. Você precisará digitalizar manualmente o código QR para fazer login se o login for bem-sucedido ou as informações de login expirarem. De modo geral, as informações de login salvas expirarão após 2 dias.
Nota: No Linux, o comando gvfs-open ou shotwell é necessário no sistema para exibir automaticamente a imagem do código QR (geralmente, sistemas com o sistema de arquivos virtual GNOME gvfs instalado conterão um desses dois comandos). No Windows 10, o programa de abertura padrão para arquivos de imagem png precisa ser definido no sistema para exibir automaticamente a imagem do código QR.
Se o sistema não puder exibir automaticamente a imagem do código QR, você poderá abrir manualmente o arquivo de imagem e escanear o código ou definir o modo de exibição do código QR para modo de caixa de correio, modo de servidor ou modo de texto para escanear o código. consulte a Seção 7 deste documento.
Depois que o QQBot for iniciado, use o comando qq em outra janela do console para operar o QQBot. Os seguintes comandos são fornecidos atualmente:
1) 帮助、停机和重启命令
qq help|stop|restart|fresh-restart
2) 联系人查询、搜索命令
qq list buddy|group|discuss [$cinfo|$clike]
( $cinfo --> $qq|$name|$key=$val )
( $clike --> :like:$qq|:like:$name|$key:like:$name )
qq list group-member|discuss-member $oinfo|$olike [$cinfo|$clike]
( $oinfo --> $oqq|$oname|$okey=$oval )
( $cinfo --> $qq|$name|$key=$val )
( $olike --> :like:$oqq|:like:$oname|$okey:like:$oname )
( $clike --> :like:$qq|:like:$name|$key:like:$name )
3) 联系人更新命令
qq update buddy|group|discuss
qq update group-member|discuss-member $ginfo
4) 消息发送命令
qq send buddy|group|discuss $rinfo $message
5) 加载/卸载/显示插件
qq plug/unplug myplugin
qq plugins
O comando list fornece funções poderosas de consulta e pesquisa de contato:
# 列出所有好友
qq list buddy
# 列出 名称 为 xxx 的群
qq list group xxx
# 列出备注名为 jack 的好友
qq list buddy mark=jack
# 列出 群“456班” 的所有成员
qq list group-member 456班
# 列出 群“456班” 中名片为 “mike” 的成员
qq list group-member 456班 card=mike
# 列出 讨论组“XX小组” 中名为 jack 的好友
qq list discuss-member XX小组 jack
Se o terceiro e quarto parâmetros estiverem no formato key=val, eles deverão estar no formato name=xx|nick=xx|mark=xx|card=xx|qq=xx. key=val, pressione O princípio de processamento é o seguinte: se for uma sequência de números, consulte por número QQ, caso contrário, consulte por nome.
Se houver um nome duplicado, todos os contatos com o nome duplicado serão listados. como:
qq list group 机器人测试
Todos os grupos denominados "Bot Test" serão listados.
Se ":like:" for adicionado ao terceiro e quarto parâmetros do comando de lista, a pesquisa será baseada em padrões de correspondência parcial:
# 列出名称中含有 “李” 的好友
qq list buddy :like:李
# 列出 QQ 中含有 “234” 的群
qq list group :like:234
# 列出备注名中含有 jack 的好友
qq list buddy mark:like:jack
# 列出 群“456班” 的中名称中含有 “李” 的成员
qq list group-member 456班 :like:李
# 列出 群“456班” 中名片中含有 “mike” 的成员
qq list group-member 456班 card:like:mike
# 列出的 讨论组“xx小组” 中名为 jack 的好友
qq list discuss-member :like:小组 jack
A partir da versão v2.2.5, o comando list usa uma tabela para gerar a lista de contatos. Um exemplo de seu estilo de saída é o seguinte:
Para garantir o efeito de exibição da tabela no terminal, recomenda-se definir a fonte de saída do terminal para consoles e o número máximo de caracteres que podem ser impressos em cada linha seja maior que 120. Observe também: Para garantir o efeito de exibição da tabela, quando o nome do contato, cartão de visita e outros atributos forem muito longos ou contiverem caracteres especiais, esses atributos serão truncados ou filtrados antes de serem enviados para o terminal.
O comando update atualiza a lista de contatos especificada e os significados de seus parâmetros são iguais aos do comando list, como:
# 更新好友列表
qq update buddy
# 更新群列表
qq update group
# 更新 群“456班” 的成员列表
qq update group-member 456班
O terceiro parâmetro no comando send tem o mesmo formato que o terceiro parâmetro no comando list. Observe que se houver um nome duplicado, uma mensagem será enviada para todos os contatos com o mesmo nome. Observe também que o segundo parâmetro só pode ser buddy/group/discuss, e não group-member/discuss-member. Exemplo:
# 给 好友“jack” 发消息 “你好”
qq send buddy jack 你好
# 给 群“198班” 发消息 “大家好”
qq send group 198班 大家好
# 给 QQ 为 12345 的好友发消息
qq send buddy 12345 xxx
# 给讨论组发消息
qq send discuss MyDiscuss hello
Você pode incorporar palavras-chave de emoticons como "/cute" no conteúdo da mensagem para enviar emoticons para a outra parte. Consulte facemap.py para obter detalhes. Você também pode usar os dois caracteres de escape n e t no conteúdo da mensagem (por exemplo: enviar buddy jack primeira linhan segunda linha).
Todos os comandos acima fornecem interfaces de API HTTP correspondentes para os desenvolvedores de front-end da web chamarem. O endereço URL da interface é http://127.0.0.1:8188/{command}. Você só precisa usar "/" para cada parâmetro. do comando após qq. Basta separar e substituir o comando na url, como: http://127.0.0.1:8188/send/buddy/jack/hello , consulte urltestbot.md para outros exemplos. Nota: Se o comando contiver caracteres chineses ou especiais, a codificação de URL (utf8) precisará ser executada primeiro. Por exemplo, chame http://127.0.0.1:8188/send/buddy/jack/nihao%20%E4%BD%. A0%E5 %A5%BD%20wohao enviará a mensagem "nihao olá wohao". (Dica: em JavaScript, você pode usar a função encodeURIComponent para codificação).
Além disso, após o QQBot ser iniciado, se você usar esta conta QQ para enviar uma mensagem "--version" para um grupo/grupo de discussão em outros clientes (como QQ móvel), o QQBot responderá automaticamente ao grupo/grupo de discussão: "QQBot -v2.xx".
É muito simples implementar seu próprio robô QQ. Você só precisa definir sua própria função de resposta de mensagem e carregá-la como um plug-in. Código de exemplo:
# -*- coding: utf-8 -*-
def onQQMessage ( bot , contact , member , content ):
if content == '-hello' :
bot . SendTo ( contact , '你好,我是QQ机器人' )
elif content == '-stop' :
bot . SendTo ( contact , 'QQ机器人已关闭' )
bot . Stop ()
Observe que o nome da função de resposta registrada acima deve ser "onQQMessage" e os parâmetros da função também devem ser consistentes com os acima.
Salve o código acima como sample.py (observe que ele é salvo como um arquivo codificado em utf8). Coloque-o no diretório ~/.qqbot-tmp/plugins/ ( ~ representa o diretório inicial do usuário, C:Usersxxx no win7) ou em um diretório que possa ser importado no sistema (como Lib/ no python diretório de instalação) diretório de pacotes de sites).
Depois disso, mantenha o processo qqbot anterior em execução e insira qq plug sample em outro console. Em seguida, a função onQQMessage neste arquivo pode ser registrada no evento correspondente do QQBot. Neste momento, se você usar outro QQ para enviar a mensagem "-hello" para este QQ, ele responderá automaticamente "Olá, sou um robô QQ" . Se você enviar a mensagem "-stop" , o robô QQ será. fechado.
Insira qq unplug sample no console para desinstalar este plug-in e a função de retorno de chamada correspondente. Vários plug-ins podem ser carregados ao mesmo tempo, e as funções correspondentes em cada plug-in serão chamadas em sequência (mas a ordem de chamada não tem nada a ver com a ordem de carregamento).
Depois que o QQBot começa a ser executado, cada vez que recebe uma mensagem QQ, ele passa a fonte da mensagem, o conteúdo da mensagem e um objeto QQBot para a função de resposta da mensagem registrada. em:
bot : QQBot 对象,提供 List/SendTo/Stop/Restart 等接口,详见本文档第五节
contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 等属性
member : QContact 对象,仅当本消息为 群消息或讨论组消息 时有效,代表实际发消息的成员
content : str 对象,消息内容
contact representa o remetente da mensagem, e seu atributo ctype pode ser buddy
/ group
/ discuss
, que representa o objeto amigo/grupo/grupo de discussão, indicando que esta mensagem é uma mensagem de amigo/mensagem de grupo/mensagem de grupo de discussão.
member só é válido quando esta mensagem é uma mensagem de grupo ou de grupo de discussão e representa o membro que realmente enviou a mensagem. Seu atributo ctype pode ser group-member
/ discuss-member
, que representa o objeto membro do grupo/membro do grupo de discussão. Quando esta mensagem é uma mensagem de amigo, member é igual a None.
Tanto o contato quanto o membro são objetos QContact. Para saber o significado dos atributos de diferentes tipos de objetos QContact, consulte: qcontact-attr. Observe que todos os objetos QContact são objetos somente leitura . Somente suas propriedades podem ser lidas, suas propriedades não podem ser definidas e propriedades adicionais não podem ser adicionadas a ele.
Você pode chamar a interface SendTo do objeto QQBot para enviar mensagens para o objeto QContact, mas observe: você só pode enviar mensagens para amigos/grupos/grupos de discussão, mas não para membros do grupo/membros do grupo de discussão . Em outras palavras, apenas bot.SendTo(contact, 'xxx') pode ser chamado, mas bot.SendTo(member, 'xxx') não pode ser chamado.
O objeto QQBot fornece um total de 9 interfaces públicas List/Update/SendTo/Plug/Unplug/Login/Stop/Restart/FreshRestart. As primeiras letras dessas interfaces são todas maiúsculas. Além disso, um atributo público conf é fornecido para salvar informações de configuração global.
Em geral, não chame/acesse outros métodos/propriedades deste objeto. Em particular, não chame essas interfaces em threads filhos . A seguir descrevemos as primeiras sete interfaces e atributos conf.
Se você precisar executar ou testar a interface acima em IDE ou python-shell, primeiro feche o processo qqbot e execute o seguinte código em IDE ou python-shell para fazer login:
>>> from qqbot import _bot as bot
>>> bot.Login(['-q', '1234'])
Corresponde ao comando de lista na Seção 3 deste documento. Retorna uma lista de objetos de contato (objetos QContact) ou Nenhum. O primeiro parâmetro tinfo é o codinome da lista de contatos e o segundo parâmetro é opcional (o formato é igual ao terceiro parâmetro do comando de lista).
O parâmetro tinfo é usado para representar uma lista de contatos. Este parâmetro é muito importante na consulta de contatos.
O significado de tinfo (caso 1): tinfo pode ser buddy
/ group
/ discuss
, que representam respectivamente lista de amigos/lista de grupos/lista de grupos de discussão. Exemplo:
# 返回 好友列表:
>>> bot.List('buddy')
# 返回名为 'jack' 的好友的列表:
>>> bot.List('buddy', 'jack')
# 返回 群列表:
>>> bot.List('group')
# 返回名为 “机器人测试” 的群的列表:
>>> bot.List('group', '机器人测试')
O significado de tinfo (Caso 2): tinfo também pode ser um objeto QContact com ctype igual a group
/ discuss
, representando a lista de membros do grupo/grupo de discussão. Por exemplo, a segunda e terceira sentenças abaixo retornam a lista dos integrantes do grupo “Classe 456” e a lista dos integrantes cujo cartão de visita é “jack” no grupo respectivamente:
>>> g = bot.List('group', "456班")[0] # g 是一个 Group 对象(群“456班”)
>>> bot.List(g) # 返回 群“456班” 的成员列表
>>> bot.List(g, 'card=jack') # 返回 群“456班” 中名片为 “jack” 的成员列表
Observe que a terceira frase acima não permite o formato bot.List(g, card='jack').
A sequência de execução interna da interface List: primeiro procure a lista de contatos representada por tinfo no banco de dados de contatos do QQBot se a lista já existir no banco de dados, pesquise nesta lista e retorne uma lista contendo a lista "todos e" contatos correspondentes cinfo "; ; se não houver tal lista no banco de dados, solicite dados do servidor QQ para obter a lista de contatos. Após a aquisição bem-sucedida, a lista de contatos será salva no banco de dados e, em seguida, pesquisará e retornará uma lista contendo "esta lista" todos. em cinfo lista de "contatos correspondentes"; se ocorrer um erro durante a solicitação de dados do servidor QQ, as informações de falha relevantes serão impressas e Nenhum será retornado.
O significado do valor de retorno da interface List: Retorna uma lista não vazia para representar todos os contatos correspondentes a cinfo na lista de contatos especificada por tinfo. Retorna uma lista vazia para representar que não há contatos correspondentes a cinfo na lista de contatos; Nenhum para representar A solicitação da lista de contatos e informações do servidor QQ falhou. Não sei se há contatos correspondentes.
Depois de chamar a interface List, certifique-se de avaliar o valor de retorno com base nas três situações acima antes de executar o código subsequente.
Nota: Quando a interface List retorna uma lista não vazia, os elementos da lista são objetos QContact, não objetos str:
>>> g = bot.List('group')[0] # g 是一个 Group 对象
>>> print([g, type(g), g.qq, g.name, g.uin, g.mark]) # 打印 g 的各项属性
Para saber o significado dos atributos de diferentes tipos de objetos QContact, consulte: qcontact-attr.
O parâmetro tinfo da interface Update tem o mesmo significado que os parâmetros da interface List. Chamar esta interface solicitará imediatamente a lista de contatos correspondente do servidor QQ e atualizará o banco de dados de contatos, e será bloqueado até que a atualização seja bem-sucedida. A atualização mais lenta é a lista de amigos. Se houver muitos amigos, ela pode ser bloqueada por 5 a 10 segundos. A lista de membros é atualizada muito rapidamente, mesmo para um grupo grande de 2.000 pessoas, o tempo de atualização é de apenas 1 a 2 segundos.
Se a atualização for bem-sucedida, True será retornado, caso contrário, False será retornado.
Exemplo:
# 更新 好友列表 :
>>> bot.Update('buddy')
# 更新 群列表 :
>>> bot.Update('group')
# 更新 某个群的成员列表 :
>>> gl = bot.List('group', "456班")
>>> if gl:
>>> g = gl[0]
>>> bot.Update(g)
Envie uma mensagem para um contato. O primeiro parâmetro é o objeto QContact e o segundo parâmetro é o conteúdo da mensagem. Lembrete novamente: você só pode enviar mensagens para amigos/grupos/grupos de discussão. Você não tem permissão para enviar mensagens para membros do grupo/membros do grupo de discussão .
Você pode incorporar palavras-chave de emoticons como "/smile" no conteúdo da mensagem para enviar emoticons à outra parte. Para obter detalhes, consulte facemap.py.
Se o envio for bem-sucedido, uma string será retornada (向xx 发消息成功
). Caso contrário, uma string contendo a causa do erro (错误:...
) será retornada.
Ao enviar uma mensagem, a mensagem pode ser enviada repetidamente. Isso ocorre porque o servidor QQ retorna o código 1202. A versão v2.1.17 adicionou um parâmetro à interface bot.SendTo para este problema: resendOn1202 Se este parâmetro for True (valor padrão), se o servidor QQ retornar o código 1202 (indicando que a mensagem pode falhar) ao enviar uma mensagem, também continuará a ser enviado 3 vezes até que o código de retorno seja 0. Se este parâmetro for False, nenhum reenvio será tentado.
Definir como True pode garantir que a mensagem será enviada na maioria dos casos, mas a desvantagem é que às vezes a mensagem será enviada repetidamente. Se definido como False, pelo contrário, a mensagem não será enviada repetidamente, mas às vezes a mensagem não pode ser enviada.
Resumindo, devido à incerteza deste código 1202, não existe uma solução perfeita. Selecione o valor de resendOn1202 de acordo com sua situação real.
O primeiro parâmetro contact deve ser o objeto QContact retornado por bot.List ou o primeiro parâmetro passado pela função de retorno de chamada onQQMessage. Exemplo:
# 向 昵称 为 jack 的好友发消息
>>> bl = bot.List('buddy', 'jack')
>>> if bl:
>>> b = bl[0]
>>> bot.SendTo(b, 'hello')
As informações de configuração global são salvas em bot.conf. Para obter detalhes sobre cada configuração, consulte a Seção 7 deste documento. Por exemplo, bot.conf.termServerPort salva o número da porta do servidor de linha de comando QQBot e bot.conf.qq salva o número QQ deste login.
Nota: As informações de configuração salvas em bot.conf são somente leitura.
Além da função de resposta onQQMessage mencionada acima, você também pode registrar funções de retorno de chamada para um total de nove eventos onInit/onQrcode/onStartupComplete/onInterval/onUpdate/onPlug/onUnplug/onExit. Consulte sampleslots para o formato do parâmetro da função de retorno de chamada, significado e. exemplos de todos os eventos py.
O processo de execução do programa e o tempo de chamada de cada função de retorno de chamada são os seguintes:
Lembrete novamente: o nome da função de retorno de chamada registrada e os parâmetros da função (número e nome) não devem ser alterados .
Quando o QQBot recebe uma mensagem de grupo, ele primeiro determina se alguém se @ com base no conteúdo da mensagem. Nesse caso, adicione uma marca [@ME]
no início do conteúdo da mensagem e passe-a para a função onQQMessage; caso contrário, substitua todos @ME
no conteúdo da mensagem por @Me
e passe-os para onQQMessage; Portanto, na função onQQMessage, você só precisa determinar se o conteúdo contém @ME
para saber se você foi @ pelo remetente da mensagem. Por exemplo:
def onQQMessage ( bot , contact , member , content ):
if '@ME' in content :
bot . SendTo ( contact , member . name + ',艾特我干嘛呢?' )
Observe que se houver outro membro no grupo cujo nome seja igual ao início do seu próprio nome (por exemplo: seu nome é ab e o nome de outro membro é abc), então, quando alguém @abc, será denunciado falsamente como @ME, neste caso, você precisa modificar o cartão de visita do seu grupo para evitar falsos positivos.
Quando este QQ envia uma mensagem, o QQBot também receberá a mesma mensagem. O objeto bot fornece um método isMe para determinar se a mensagem é enviada por si só:
def onQQMessage ( bot , contact , member , content ):
if bot . isMe ( contact , member ):
print ( 'This is me' )
A partir da versão 2.1.13, o qqbot fornece um poderoso decorador de funções - qqbotsched
para personalizar tarefas agendadas, exemplo de código:
from qqbot import qqbotsched
@ qqbotsched ( hour = '11,17' , minute = '55' )
def mytask ( bot ):
gl = bot . List ( 'group' , '456班' )
if gl is not None :
for group in gl :
bot . SendTo ( group , '同志们:开饭啦啦啦啦啦啦!!!' )
Após o carregamento do código acima em forma de plug-in, uma mensagem será enviada automaticamente para o grupo “Turma 456” todas as 11h55 e 17h55: “Camaradas: O jantar está servido!!!”
O decorador qqbotsched aceita um total de 11 parâmetros de palavras-chave: ano, mês, dia, semana, dia_da_semana, hora, minuto, segundo, data_inicial, data_final, fuso horário. Cada parâmetro representa o valor que o componente de tempo customizado da tarefa deve corresponder. Por exemplo: hora='11,17' significa que a tarefa deve ser executada às 11:xx ou 17:xx, minuto='55' significa que a tarefa deve ser executada às xx:55, minuto='0-55/5' significa que a tarefa deve ser executada às xx: 00, xx:05, xx:10, ..., xx:55 executa a tarefa, day_of_week='mon-fri' (ou '0-4') indica que a tarefa deve ser executado de segunda a sexta-feira.
qqbotsched é um encapsulamento simples do apscheduler da estrutura de tarefas agendadas do Python, e seus parâmetros devem ser inseridos no formato crontab em sistemas Unix. Para obter informações sobre o crontab e o apscheduler da estrutura de tarefas agendadas do Python, consulte os seguintes materiais de referência:
Para obter detalhes sobre o formato de cada parâmetro crontab, consulte:
Registrar funções de retorno de chamada e personalizar tarefas agendadas é a única maneira de estender o QQBot. Ao escrever essas funções, preste atenção ao seguinte:
Ao fazer login no WebQQ, você precisa usar seu celular QQ para escanear a imagem do código QR. No QQBot, a imagem do código QR pode ser exibida nos quatro modos a seguir:
O modo GUI é o modo padrão e está disponível apenas em PCs. O modo caixa de correio pode ser usado em computadores pessoais e servidores remotos. O modo servidor geralmente é usado apenas em sistemas com endereços IP públicos. Se você usar a caixa de correio QQ para receber o código QR, após enviar a imagem do código QR, o cliente QQ móvel receberá imediatamente uma notificação. Abra o e-mail no cliente QQ móvel e pressione longamente o código QR para digitalizar. O modo de texto é conveniente para uso durante o processo de desenvolvimento ou implantação do servidor e fornece aos desenvolvedores um atalho para fazer login no QQ.
Nota: Quando o modo de caixa de correio/modo de servidor/modo de texto está ativado, o modo GUI é desativado e a imagem do código QR não aparecerá automaticamente durante o login.
Um gerenciador de código QR (objeto QrcodeManager) será criado sempre que você fizer login. O gerenciador de código QR selecionará o método de exibição da imagem do código QR com base no arquivo de configuração e nos parâmetros da linha de comando.
O arquivo de configuração é ~/.qqbot-tmp/v2.x.conf ( ~ representa o diretório inicial do usuário, que é C:Usersxxx no win7 e /home/xxx no linux. Ele será configurado automaticamente após a execução). QQBot pela primeira vez Crie este arquivo de configuração com o seguinte conteúdo:
{
# QQBot 的配置文件
# 使用 qqbot -u somebody 启动程序时,依次加载:
# 根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
# 使用 qqbot 启动程序时,依次加载:
# 根配置 -> 默认配置 -> 命令行参数配置
# 用户 somebody 的配置
"somebody" : {
# QQBot-term (HTTP-API) 服务器端口号(该服务器监听 IP 为 127.0.0.1 )
# 设置为 0 则不会开启本服务器(此时 qq 命令和 HTTP-API 接口都无法使用)。
"termServerPort" : 8188,
# 二维码 http 服务器 ip,请设置为公网 ip 或空字符串
"httpServerIP" : "",
# 二维码 http 服务器端口号
"httpServerPort" : 8189,
# 自动登录的 QQ 号
"qq" : "3497303033",
# 接收二维码图片的邮箱账号
"mailAccount" : "[email protected]",
# 该邮箱的 IMAP/SMTP 服务授权码
"mailAuthCode" : "feregfgftrasdsew",
# 是否以文本模式显示二维码
"cmdQrcode" : False,
# 显示/关闭调试信息
"debug" : False,
# QQBot 掉线后自动重启
"restartOnOffline" : False,
# 在后台运行 qqbot ( daemon 模式)
"daemon": False,
# 完成全部联系人列表获取之后才启动 QQBot
"startAfterFetch" : False,
# 插件目录
"pluginPath" : ".",
# 启动时需加载的插件
"plugins" : [],
# 插件的配置(由用户自定义)
"pluginsConf" : {},
},
# 可以在 默认配置 中配置所有用户都通用的设置
"默认配置" : {
"qq" : "",
"pluginPath" : "",
"plugins" : [
'qqbot.plugins.sampleslots',
'qqbot.plugins.schedrestart',
],
"pluginsConf" : {
'qqbot.plugins.schedrestart': '8:00',
}
},
# # 注意:根配置是固定的,用户无法修改(在本文件中修改根配置不会生效)
# "根配置" : {
# "termServerPort" : 8188,
# "httpServerIP" : "",
# "httpServerPort" : 8189,
# "qq" : "",
# "mailAccount" : "",
# "mailAuthCode" : "",
# "cmdQrcode" : False,
# "debug" : False,
# "restartOnOffline" : False,
# "daemon" : False,
# "startAfterFetch" : False,
# "pluginPath" : "",
# "plugins" : [],
# "pluginsConf" : {}
# },
}
Você pode adicionar sua própria configuração de usuário no arquivo de configuração (ou seja, adicionar um novo item no dicionário do arquivo, e a chave deste item representa um usuário. Por exemplo, o item alguém já no arquivo representa o usuário). nomeado alguém , ao executar o QQBot, digite qqbot -u alguém e as configurações do projeto alguém serão carregadas.
A seguir são descritas as funções de cada configuração no arquivo de configuração. O conteúdo a seguir pressupõe que a configuração em alguém foi modificada e executada no modo qqbot -u Someone .
Se precisar usar o modo de caixa de correio para exibir o código QR, você pode definir os itens mailAccount e mailAuthCode como a conta da caixa de correio e o código de autorização, respectivamente. Após a execução, o gerenciador de código QR enviará a imagem do código QR para a caixa de correio.
Nota: O código de autorização não é a senha de login da caixa de correio, mas o código de autorização fornecido pelo provedor de serviços de caixa de correio para ativar o serviço IMAP/SMTP (lembrete: nem o serviço POP3/SMTP pode ativar isso na caixa de correio). as configurações da caixa de correio do serviço da versão web e obtenha o código de autorização. Se apenas mailAccount for definido, mas não mailAuthCode, o código de autorização deverá ser inserido manualmente quando o programa for iniciado.
O modo de caixa de correio foi testado nas caixas de correio QQ, NetEase e Google.
Se precisar usar o modo servidor, você pode configurar os itens httpServerIP e httpServerPort. De modo geral, eles devem ser configurados para ip de rede pública. Depois que o modo servidor for ativado, você poderá acessar a imagem do código QR por meio de http://{httpServerIP}:{httpServerPort}/{any}. onde {qualquer} pode ser qualquer sequência não vazia de números ou letras.
Quando o modo de caixa de correio e o modo de servidor estão ativados ao mesmo tempo, a imagem real não será enviada ao enviar um e-mail. Apenas o endereço da imagem será enviado para a caixa de correio e só será enviado uma vez. expira, basta atualizar o e-mail. Se você ativar apenas o modo de caixa de correio, a imagem real será enviada ao enviar um e-mail. Quando o código QR expirar, você precisará definir o e-mail como lido (o e-mail será lido após você clicar no e-mail com QQ no seu. telefone celular) antes de ser enviado as últimas imagens do código QR.
Se o item cmdQrcode estiver configurado como True, o código QR será exibido em modo texto no termo. Nota: Para usar o modo de texto, você mesmo precisa instalar as bibliotecas pillow e wcwidth. Você pode usar pip para instalá-las.
Cada usuário no arquivo de configuração possui o item qq. Se este item tiver sido definido para um determinado número QQ, o QQBot fará login automaticamente usando as informações de login salvas no último login deste número QQ quando for iniciado.
Se o item restartOnOffline estiver definido como True no arquivo de configuração, o QQBot será reiniciado automaticamente quando ficar offline ou terminar com um erro.
Esta opção só é válida em sistemas do tipo UNIX. Definir a opção daemon na configuração como True executará o programa no modo daemon. Neste ponto, a saída padrão e o erro padrão são redirecionados para o arquivo daemon-$qq.log (onde $qq é o valor da opção qq na configuração).
Em circunstâncias normais, o QQBot será iniciado imediatamente após a leitura do código QR para fazer login. Ele só obterá a lista de contatos e atualizará o banco de dados de contatos quando necessário. Se startAfterFetch no arquivo de configuração estiver definido como True, o QQBot aguardará que todas as listas de contatos sejam obtidas antes de iniciar . Observe que se houver mais contatos, levará mais tempo.
Após o início do QQBot, um servidor QQBot-term será aberto para monitorar os comandos de operação enviados pelos usuários por meio da ferramenta de linha de comando qq e os comandos de operação enviados por meio da interface API HTTP. O IP de escuta deste servidor é sempre 127.0.0.1. e o número da porta de escuta padrão é 8188, esse número de porta pode ser modificado modificando o valor de termServerPort.
Se o número da porta do servidor QQBot configurado não for o padrão 8188, ao executar o comando qq, você precisará especificar o número da porta no primeiro parâmetro, como:
$ qq 8100 send buddy jack hello
$ qq 8100 list group-member chatbot
Da mesma forma, o número da porta da interface HTTP API também precisa ser alterado, como: http://127.0.0.1:8100/send/buddy/jack/hello.
Se você não precisar usar o comando qq e a interface HTTP-API, poderá definir esse número de porta como 0 e o servidor QQBot-term não será aberto neste momento.
Se precisar fazer login em vários números QQ na mesma máquina, você pode abrir diretamente vários processos qqbot em diferentes terminais para fazer login. No entanto, cada processo qqbot deve definir seu próprio termServerPort e httpServerPort (ou todos definidos como 0 ou valor vazio ), caso contrário ocorrerá um conflito de número de porta.
Se o item de depuração estiver definido como True, as informações de depuração serão impressas durante a execução.
Geralmente, os plug-ins precisam ser armazenados no diretório de importação do sistema ou no diretório ~/.qqbot-tmp/plugins. Você pode configurar outros diretórios de armazenamento na opção pluginPath. Além disso, na opção plugins, você pode especificar os plugins que precisam ser carregados quando o QQBot for iniciado.
Todas as opções no arquivo de configuração possuem parâmetros de linha de comando correspondentes e as opções inseridas nos parâmetros de linha de comando têm prioridade mais alta do que aquelas no arquivo de configuração. Digite qqbot -h para visualizar todos os formatos de parâmetros de linha de comando.
Existem quatro níveis de configuração no programa e suas prioridades são as seguintes:
使用 qqbot -u somebody 启动程序时,依次加载:
根配置 -> 默认配置 -> 用户 somebody 的配置 -> 命令行参数配置
使用 qqbot 启动程序时,依次加载:
根配置 -> 默认配置 -> 命令行参数配置
Entre eles: a configuração raiz é fixa e não pode ser modificada pelos usuários; a configuração padrão e a configuração do usuário podem ser modificadas pelos usuários no arquivo v2.x.conf; finalmente, as configurações também podem ser inseridas nos parâmetros da linha de comando;
Quando o qqbot estiver em execução, ele pesquisará/criará os seguintes arquivos/diretórios no diretório de trabalho:
O diretório de trabalho padrão é ~/.qqbot-tmp/ Você pode especificar outros diretórios de trabalho por meio do parâmetro de linha de comando -b|--bench ao iniciar o qqbot, por exemplo: qqbot -b bench.
Um plug-in é na verdade um módulo python, portanto pode ser um arquivo python ou um pacote python. qqbot procurará plug-ins nos seguintes diretórios com base no nome do plug-in:
método hot-plug
Você pode carregar/descarregar plug-ins dinamicamente durante a execução do qqbot. Existem três métodos:
Os dois primeiros métodos são chamados por processos externos do processo qqbot, e o terceiro método é usado dentro do processo qqbot. Não use os dois primeiros métodos dentro do processo qqbot.
Nota: Os plug-ins carregados usando o método hot-plug serão perdidos após a reinicialização do qqbot.
modo de conexão automática na inicialização
Você também pode carregar plug-ins automaticamente quando o qqbot for iniciado. Basta especificar o nome do plug-in que precisa ser carregado na opção de plug-ins na configuração (parâmetro de linha de comando -pl|--plugins). Esses plug-ins serão carregados na inicialização, antes do login.
Além disso, se houver um pacote chamado qqbotdefault no sistema (ou no diretório de plug-ins), todos os submódulos do pacote serão carregados automaticamente como plug-ins na inicialização (nota: o próprio qqbotdefault não será carregado como um plug-in).
Escrever plug-ins envolve principalmente escrever funções de retorno de chamada ou funções de tarefas agendadas. Consulte as Seções 4 a 6 para obter detalhes.
nome | autor do github | Descrição da função | Se deve ser carregado por padrão |
---|---|---|---|
qqbot.plugins.sampleslots | pandólia | Exemplo de função de retorno de chamada | sim |
qqbot.plugins.schedrestart | pandólia | Reinicialização agendada | sim |
qqbot.plugins.miniirc | pandólia | Servidor de IRC | não |
senhalogin | pandólia | Faça login usando nome de usuário-senha | não |
bloco de anúncios | feisuweb | Bloqueio de anúncios em grupo | não |
registro de bate-papo | feisuweb | Registro de conteúdo de bate-papo | não |
Se você tiver algum plug-in útil para compartilhar, envie-me um e-mail.
No sistema Linux, como o cliente QQ não pode ser usado, o plug-in qqbot.plugins.miniirc pode ser usado para implementar a função de chat IRC. Método de carregamento: qq plug qqbot.plugins.miniirc, ou carregue na inicialização: qqbot -pl qqbot.plugins.miniirc, ou adicione qqbot.plugins.miniirc
à opção de plugins no arquivo de configuração.
Depois que o plug-in for carregado, um micro servidor IRC será aberto na porta 6667. Os usuários podem usar clientes IRC (como weechat, irssi, etc.) para se conectar a este servidor e obter bate-papo no modo de linha de comando. A seguir, usamos o weechat como exemplo para apresentar como usá-lo:
启动 weechat : weechat
连接本服务器: /connect localhost
进入 群聊天 会话: /join group-name
进入 讨论组聊天 会话: /join !discuss-name
进入 好友聊天 会话: /query buddy-name
进入 聊天会话 后,直接敲入文本并回车就可以向对方发送消息了。所有接收到的 QQ 消息也会被转发给相应的 聊天会话 。
在聊天会话之间切换: ctrl+P 或 ctrl+N
显示所有 群和讨论组 的名称: /list
Acima estão quase todas as funções fornecidas por este micro servidor IRC, mas é suficiente para conversar com amigos/grupos/grupos de discussão QQ.
QQBOT refere -se aos seguintes projetos de código aberto:
Gostaria de agradecer aos três autores acima por seu compartilhamento altruísta, especialmente a Scienjus por sua análise aprofundada e detalhada do protocolo SmartQQ.