A tarefa parece simples quando você não sabe nada sobre isso e quando decide.
Em um dia "maravilhoso", percebi que não estou interessado em participar de vários fóruns, mas quero criar meu próprio canal e compartilhar "sabedoria".
Eu gosto dos recursos do Telegram incorporados, incluindo bots, então o canal na forma de um blog foi criado lá. Ele começou a procurar bots para ajudar a escrever mensagens .... e desde que eu não quero encontrá-lo. Bem, escreva você mesmo. As pessoas inteligentes são aconselhadas a escrever em Python.
Eu li o primeiro tutorial na Internet em 149 páginas. Eu estou familiarizado com Pascal, FoxPro, Interbase e até (ha ha 3 vezes) há 20 anos que vendi meus programas e, de alguma forma, não deu certo, entrei no comércio. Trabalhar como programador me ajudou bastante na definição de tarefas para codificadores. Mas, voltando ao Python, parece nada complicado, porque também era possível programar no BASIC, e este não é o meu diploma de faculdade com um complexo de software e hardware do gerador de verificação MIG no Assembler. Um problema, já fazia muito tempo, retornando ao título - parece que é simples, porque ainda não sei nada sobre a tarefa, mas vale a pena tentar.
Decidi que é mais conveniente fazer um projeto de um smartphone para Android, porque está sempre à mão. Então coloque:
- Pydroid 3 - IDE para Python 3 Na verdade, Python para Android.
- @BotFather, No Telegram, instalamos o pai de todos os bots - você precisará dele para obter o identificador do seu bot e fazer configurações básicas.
- Reinicie o aplicativo para iniciar um projeto no heroku.
- GIT Um aplicativo para hospedagem online de repositórios.
- Windscribe Sem VPN em qualquer lugar?
- Emulador do Terminal Termux e ambiente Linux.
E qual é o resultado final? A programação em um smartphone é possível em teoria, mas impossível na prática. Verifique o código o máximo possível, corrija o erro, investigue o desempenho.
Uma introdução tão longa e o que eu queria obter do meu bot. A princípio, pareceu-me o suficiente adicionar um hashtag no final da mensagem. Em seguida, o pensamento veio para "cobri-lo" com um link para o meu canal; portanto, com a repostagem, haverá uma atração adicional à fonte do canal. Em seguida, ele adicionou a automação do link de origem, de onde recebo a mensagem. A seguir, farei uma digressão. A publicidade, é claro, é o motor do progresso. Mas, às vezes, sua quantidade passa pelo telhado. O telegrama foi escolhido por mim, entre outras coisas, porque há uma oportunidade de lutar contra o último. Eu respeito os leitores do meu canal e, portanto, limpo as notícias interessantes encontradas no Ineta da publicidade e as envio ao canal. Ao mesmo tempo, respeito os autores e quase sempre dou um link para a fonte na forma de "Leia mais ...". Devido à aversão à publicidade, faço o download do conteúdo do YouTube e o carrego no meu canal como um arquivo de vídeo. Em um determinado momento, o bot que baixou o vídeo ficou louco e começou a me enviar anúncios a cada hora. Então, no meu bot, houve uma oportunidade de baixar vídeos do YouTube. Recentemente, a propósito, eu conheci o autor deste bot, ele ficou muito surpreso, porque Segundo ele, ele envia "apenas" anúncios 20 vezes por mês. O mesmo aconteceu com o bot que faz a marca d'água - ela foi enviada ao forno e tive a oportunidade de fazer uma marca d'água.
Para escrever um programa do zero, tive que pesquisar muitas informações na Internet. Espero que aqueles que seguem meus passos ajudem. Então, de onde obtive as informações e o que usei:
- Os artigos sobre Habrr realmente me ajudaram. Portanto, não vou reescrever como e o que instalar. Está tudo lá. A propósito, entrei em contato com os autores de maneira pessoal e eles nunca recusaram minha ajuda.
- github Um serviço de hospedagem de repositório online com todos os recursos do controle de versão distribuído e da funcionalidade de controle de origem. Primer
- O heroku é uma plataforma PaaS baseada em nuvem que suporta várias linguagens de programação. Rapidamente o abandonou.
- pyTelegramBotAPI - Uma das principais bibliotecas ao escrever um bot para Telegrams.
- Tutorial de ortografia bot
- Python 3 para iniciantes
- Bots: informações para desenvolvedores
- Referência HTML
- Em nenhum lugar sem uma VPN?
Uma segunda digressão ou plano de guerra será exibida. Quando comecei a escrever o bot, a primeira coisa que vi foram os códigos de outra pessoa. Se não há kamenty, dificilmente se pode entender:
A terra tremeu como nossos seios
Cavalos misturados em um monte, pessoas,
E voleios de mil armas
Fundido em um longo uivo ...
Lermontov escreveu sobre o código. A pilha contém funções, decoradores. Não há código de beleza, ninguém se importa com recursos. Embora a beleza seja mais provável de ser vista pelo masoquista esquisito. O significado da frase de um programador familiar "Veja o programa, talvez você possa descobrir" rapidamente me alcançou. A explosão cerebral mais importante que tive foi quando finalmente percebi que o código é orientado a eventos, não seqüencial. Este é um nível diferente.
O segundo problema é a falta de boa documentação. Mesmo em Basurm. Eu darei um exemplo Envio uma foto para os telegramas, e ele a sacode sem vergonha. Aconteceu que um argumento inválido foi escrito na linha:
file_info = bot.get_file(message.photo[-1].file_id)
E qual é a documentação? Nós vamos para a fonte


Esta é uma matriz. Você pode caminhar por ela, estudar onde o tamanho volta. Obrigado, pessoas inteligentes sugeriram o que prescrever.
Embora do que estou falando, mesmo que os gurus estejam perdidos.
Quando escrevi o código da marca d'água, usei uma fonte livre e, para torná-la em negrito, apliquei a solução para exibir a mensagem três vezes com deslocamento de pixel, não sei quão bonita é a solução, mas funciona.
font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", width//20) pos = (width//4, height - height//10) text = skanal drawing.text(pos, text, fill=black, font=font) pos = (1 + width // 4, 1 + height - height // 10) drawing.text(pos, text, fill=black, font=font) pos = (2 + width // 4, 2 + height - height // 10) drawing.text(pos, text, fill=black, font=font)
A posição, como você pode ver, é selecionada dependendo do tamanho da imagem e da altura da fonte também. Imediatamente me deparei com um ponto interessante: embora a fonte seja parte integrante da biblioteca PIL, já que a primeira linha diz que funciona localmente, mas no Docker, não. A saída é fazer o download para o repositório, adicionar o caminho ao arquivo de ambiente e escrever outro caminho no programa.
Outra coisa incompreensível para mim aconteceu com a imagem após o processamento usando a biblioteca PIL (imediatamente após a marca d'água). Eu envio para o meu bot:
with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi)
Está tudo ótimo, eu gosto da foto. Então eu preciso adicionar um comentário à imagem e ver se tudo fica bonito juntos? Escrevemos:
bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ')
Por alguma razão, a imagem original, não processada, entra no bot. Bem, vamos tentar enganar: getupdates.offset -1, não faz sentido, o Telegram tem certeza de que esta é a mesma foto. Ok, fazemos isso:
with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi)
Reescrever:
bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ')
O resultado é o mesmo - a imagem original é exibida. E apenas substituir a mensagem no primeiro argumento por informação deu o resultado desejado.
Também fornecerei um código interessante de nível de entrada do YouTube (NB: sem verificação de erro):
elif message.entities:
Para mim, o obstáculo era que as entidades são uma matriz de matrizes e você precisa "revisar" toda a matriz para que o bot entenda que estamos trabalhando com um link. Também descobriu-se que os usuários enviam o link para o bot como "Compartilhar" no YouTube, de modo que "youtu.be" também está escrito no exemplo. Eu não encontrei uma maneira de enviar imediatamente um arquivo para o Telegram, então nós o salvamos, enviamos e excluímos. Durante o teste, fui imediatamente informado de que as pessoas começariam a baixar arquivos gigantes - mais tarde, tive que introduzir uma restrição.
Antes do lançamento do bot, ficou repentinamente claro que eu não tinha uma verificação dos direitos de acesso ao canal. Por exemplo, conhecendo meu canal, qualquer usuário de bot poderia enviar uma mensagem para lá, porque O bot é um administrador. Eu tive que fazer uma verificação urgente:
if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]:
Aqui, obtemos a lista de administradores do canal e veremos se o autor da mensagem também é um administrador.
Algumas palavras sobre como você teve que lutar com Roskomnadzor. Como o acesso à API está bloqueado, para desenvolver o bot localmente, você precisa, de alguma forma, passar o tráfego por nossos valentes defensores. Você pode fazer isso de duas maneiras - por meio de uma VPN ou de um proxy. A maneira mais simples, rápida e "normal" é o túnel ssh: estabelecemos uma conexão entre o cliente e o servidor proxy, obtemos uma porta no host local onde o tráfego pode ser enviado do nosso lado e ele sai do outro lado (já em algum lugar na Alemanha). Por conveniência, você pode adicionar um pouco de automação dessa conexão - um script e um atalho na área de trabalho, que o iniciará, se necessário. Pelo método "normal", quero dizer aqui a situação em que controlamos os pontos de entrada e saída - à esquerda está o nosso laptop, à direita está o VPS na Alemanha. no meio, o tráfego pode ser interceptado, tanto quanto desejado, é criptografado e, na saída, nos encontramos na jurisdição de outro estado, e as leis da Federação Russa não se aplicam a ele. Como vantagem, temos uma garantia adicional de que o servidor proxy não será alterado ou desligado até que façamos isso sozinhos. I.e. diferente de qualquer VPN de tio, temos tranquilidade e confiança no futuro.
Script
/home/user/proxy.sh
Código de script
Depois de estabelecermos uma conexão com o servidor e a porta estar aberta, precisamos direcionar o tráfego para lá. Percorrendo o caminho de menor resistência e para não pensar em como configurar o proxy no IDE \ docker \ python, você pode fazer uma configuração para todos, proxychains será uma configuração dessas. Se você executar qualquer software usando este utilitário, ele redirecionará o tráfego através da cadeia de proxy registrada na configuração.
/etc/proxychains.conf
No nosso caso, essa é uma cadeia e escrever não é difícil.
socks5 127.0.0.1 1080
e outra muleta usada para não configurar a VPN (sarcasmo) é uma maneira de iniciar um aplicativo Python a partir do PyCharm. No caso simples, para executar o aplicativo através de proxychains, basta escrever proxychains app.py e pronto. Mas o IDE sempre exige um intérprete. É fácil contornar isso - crie uma nova "configuração de execução", selecione um script de shell. e preencha os campos

Depois disso, o lançamento do ponto de vista do IDE assume este formato: proxychains python3 app.py - é exatamente isso que precisamos. Assim, quando queremos iniciar um projeto, tudo o que precisamos fazer é executar o script na área de trabalho e clicar no botão "play" no ide para iniciar o bot.Todo o resto da mágica será feito por proxychains e ssh.
Finalmente, o bot é escrito, testado. O que vem a seguir? Por um lado, quero me declarar, por outro, acho que pode ser realmente útil para alguém. E aqui estamos diante de outro problema do telegrama; não possui um único catálogo de canais e bots. É bem possível que exista um bot semelhante ao meu, mas repito que não o encontrei. E em algum lugar do bonde um homem senta e sofre, que quer organizar uma mensagem lindamente no canal e ele faz tudo com canetas.
Se você já executou meu bot, viu que existe uma hashtag #Advertising. Como assim? - você pergunta. E aqui discuti o problema com os usuários finais - muitos postaram anúncios em seus canais e rapidamente se acostumaram a escrever mensagens usando o bot, eles me pediram para adicionar. Você pode não gostar de publicidade, combatê-la, mas essas são realidades duras e necessárias para os usuários.
O projeto é sem fins lucrativos, então acho que você pode chamar o bot em si @SGK_espace_bot.
E aqui está o vídeo como usarEu ficaria grato por qualquer crítica construtiva.