Giter VIP home page Giter VIP logo

informer's Introduction

image

Informer - Telegram Mass Surveillance

Update 08-23-2021

  • Updated to latest Telethon 1.23.0
  • Fixed database issues by migrating to docker-compose
  • Made Google Spreadsheets optional in setup
  • Secure ENV files for setup
  • Easier setup
  • Replaced docker-compose in lieu of App Engine bc AE sux

About

Informer (TGInformer) is a bot library that allows you to masquerade as multiple REAL users on telegram and spy on 500+ Telegram channels per account. Details are logged to a MySQL database, a private Google Sheet and your own private channel for analysis.

This is a functioning proof-of-concept project with known bugs. Feel free to fork, share and drop me a line.

image

Potential Business Applications

  • Sock puppeteering to overthrow a despotic regime
  • Brand monitoring and sentiment analysis
  • Shilling cryptocurrency at a moments notice for financial gain
  • Influencing sentiment on topical issues
  • Getting in on price action early
  • Running analysis of a telegram channel

Features

  • Run all your bots in the cloud while you sleep. Support for Docker Compose

image

  • Write all notifications to private Google Sheet

image

  • Supports regular expressions for keyword filtering

  • SQLAlchemy for agnostic data persistence

image

  • Logging contextual message and channel data to a private channel and database

  • Stores meta information about sender of message, channel, number of participants in the channel

image

  • Auto-joins channels from CSV list containing Telegram channel URLs

image

  • Persists session of channels joined

  • Login once, bot stays logged in forever without needing 2FA re-authentication

  • Join up to 500 channels per account

image

  • Uses REAL accounts avoiding bot detection, THIS IS NOT A TELEGRAM BOT but a real automated user account. This is an important distinction because the official bot API is limited and bots are often restricted in public channels.

Requirements

OS / Infrastructure

Python packages

  • SQLAlchemy (1.3.11)
  • sqlalchemy-migrate (0.13.0)
  • Telethon (1.10.8)
  • mysql-connector-python (8.0.18)
  • gspread (3.1.0)
  • oauth2client (4.1.3)

Quick Start

Setup your ENV vars

Edit the file informer.env which contains all the required environmental variables for informer

You can retrieve the necessary Telegram-related information here:

Setup Your Telegram App

  1. Head over to https://my.telegram.org/auth to authenticate your account by providing a phone number and the confirmation code sent to your phone number (or Telegram) image

image

  1. Once you are authenticated, click on "API Development Tools" image

  2. Go ahead and create a New Application by filling out the form shown below image

  3. You should now have the necessary parameter values for the informer.env file fields TELEGRAM_API_HASH and TELEGRAM_API_APP_ID

image

  1. Go ahead and replace the values, including TELEGRAM_ACCOUNT_PHONE_NUMBER and move on to the next section

image

Getting your Telegram ID

So far we have what we need for Telethon and Informer to access the Telegram APIs, next we need to acquire the indentifiers for your bot's account.

  1. Open Telegram and search for the user userinfobot.

image

  1. You will see multiple, make sure you select the correctly spelled account.

image

  1. Click on the user and you should see a dialog option at the bottom that says "Start". Click on this.

image

  1. The bot has a single purpose, to reflect back to you your current Telegram account's information.

You should receive your Telegram username and your Telegram account ID. This is important

image

  1. Go ahead and edit the informer.env file and fill in the values for TELEGRAM_ACCOUNT_ID which should be your Telegram account ID from the previous step and TELEGRAM_ACCOUNT_USER_NAME.

You can optionally fill in TELEGRAM_NOTIFICATIONS_CHANNEL_ID with your user name or a channel ID.

  1. Make sure you have TELEGRAM_ACCOUNT_PHONE_NUMBER filled out as this is key to generating the session. For creating multiple accounts, please check out the Burner App below.

Initialize and authenticate session

Make sure you are running python 3 and simply run ./quick_start.sh in the directory.

You must run this first so that you can authenticate with Telegram on the first run and generate a local session file

You can later copy the files for the different accounts in app/session and mount them via Docker should you choose to do so.

image

You will be prompted to enter in the authentication code you received either via Telegram if you have logged in before, or via SMS

image

Hit enter and your session should be generated in the folder app/session with the file name as the international phone number you provided with a .session extension.

Continue to the next section where we use Docker Compose to setup a database.

Setup a Notification Channel

This step is optional, but if you would like to create a private group channel and would like to acquire the group ID do the following:

  • Create a group (or channel) and set it as private or public
  • Be sure to get the Telegram URL image

Set the URL in the informer.env file under the parameter TELEGRAM_NOTIFICATIONS_CHANNEL_URL

To get the channel ID simply run python3 bot.py <TELEGRAM_ACCOUNT_ID> in the app directory where <TELEGRAM_ACCOUNT_ID> is the account ID you previously generated.

When the script loads, it will display all the channels you are in, simply copy this value and put it in the TELEGRAM_NOTIFICATIONS_CHANNEL_ID parameter of the informer.env file and kill the script. You're now ready to run Informer.

Running Docker Compose

After running quick_start.sh you can run docker compose by:

  • running ./start.sh to build the Docker containers which include the MySQL database

image

  • Run ./stop.sh to stop the containers

  • Run ./clean.sh to remove an dangling containers and volumes. ** NOTE ** this will RESET the database and you will lose all your data.

A few things to note:

Before you were required to run your own MySQL instance and this created some issues with connection string compatability and versioning. In this update, it is just created for you and persisted on disk.

Additionally Dozzle is provided so that you may view logs in your browser, simply go to http://localhost:9999 and click on the app_informer container.

Create a telegram account with Burner App

If you do not want to use your own phone number and want to run the Informer bot with some degree of anonymity you can use the Burner App available on iOS and Android.

  1. Install the app Burner

image

  1. Follow the same steps as above by providing the new phone number here: https://my.telegram.org/auth

  2. Validate with Burner. You will be sent an authcode via SMS, you will need to provide

image

  1. Log into Telegram

  2. Attempt to login with the app by running

python3 bot.py <api_user_id> in the app directory.

  1. Since you are logging in with Telethon it will ask you for your authcode in the terminal like earlier.

This was sent via Telegram message or SMS.

Provide this and it will save your session credentials in the session file mentioned below. You will no longer need to authenticate so long as you have the session file saved.

Sessions are saved in the app/session/ folder as <telegram_phone_number>.session

Rinse and repeat until you have all the necessary session files and simply mount them in Docker.

Scaling Telegram accounts

Figuring out how to scale accounts was a bit of a nightmare as I needed an automated process. Telegram requires you use a real phone number that can recieve texts from a shortcode.

Unfortunately services with APIs like Twilio are prohibited from receiving SMS from shortcodes in the US, Canada and UK https://support.twilio.com/hc/en-us/articles/223181668-Can-Twilio-numbers-receive-SMS-from-a-short-code- for fraud purposes. This would’ve been ideal, bahumbug.

A whole evening was wasted on this endeavor until I remembered a great app I used in the past: Burner (https://www.burnerapp.com/) — which coincidentally does have an API (https://developer.burnerapp.com/api-documentation/incoming-webhooks/). Meaning you can dynamically generate numbers, instantiate a new account and authenticate it all via Telegram’s client SDK in Python (Telethon: https://docs.telethon.dev/en/latest/)

The best part is Burner numbers are free for 14 days. Telegram accounts connected via client API need only login once and permanently persist sessions. I have not integrated with the Burner API, but the process is straight forward.

Telethon SDK

The bot is built on top of the Telethon Python SDK (https://docs.telethon.dev/en/latest/)

A few things to note and gotchas encountered in building this proof of concept:

  1. Rate Limiting Telegram does intense rate limiting which will throw FloodWaitErrors. In my research it seems like no one knows the algorithm for this but you want your back off waits to scale in response because when you violate and exceed the unknown rate limit, the waits become exponential. I’ve found a happy medium with my approach to waiting.

FloodWaitErrors can occur when you are submitting too many requests to the API whether it is querying users information or joining too many channels too fast

  1. Telethon Sessions Telethon will create a session file. You can set the name of the session file when you instantiate the Telethon client:

TelegramClient(<session_file_name>, <api_user_id>, <api_user_hash>)

This file happens to be a sqlite database which you can connect to. It 	
acts like a cache and stores historical data as well as your session 
authentication information so you will not have to re-authenticate with 
Telegram’s 2FA . Note that you will need to login for a first time and 
authenticate when you first use the API.

Managing Multiple Bot Accounts

As the bot runs and joins channel, you will see your client update in real time and display the new channels you have joined.

image

TIP: TelegramX is by far the better client to use for these purposes as it supports multiple login. Download here:

Google Sheets Integration

The python library gspread is used for managing io with Google Sheets. You will need to have a Google Cloud Platform account and enable Google Drive APIs. Afterwards you must generate server credentials with a json api key.

Instructions are here: https://www.twilio.com/blog/2017/02/an-easy-way-to-read-and-write-to-a-google-spreadsheet-in-python.html

This is optional.

Known Bugs

  • Currently a channel must have already been joined in order to begin monitoring of keywords. It is likely you will need to run the bot.py twice, once to let it join channels and another time to monitor them. I’m aware of this glaring bug and will fix it in the next revision.

Todo

  • Create user interface dashboard for bot management
    • Create new accounts
    • Add / remove channels
    • Add / remove keywords to monitor
    • View notifications
    • Recieve web push notifications
  • Automatically poll the database to update the keywords to monitor in memory
  • Automate creation of phone numbers via Burner API and authcode process

Getting in touch

Did you find this project interesting? Please star it if so.

It was made in two days as a proof of concept for a friend in the cryptocurrency space. If you find any interesting or lucrative applications, I’m always happy to collaborate. You can reach me at:

@paulpierre on Twitter or hi (at) paulpierre (dot) com

Most of my interesting projects are private on github, but feel free to check them out: http://www.github.com/paulpierre or past work at http://www.paulpierre.com

Open Source License


Copyright (c) 2020 Paul Pierre Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

informer's People

Contributors

dependabot[bot] avatar drego85 avatar paulpierre avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

informer's Issues

build_database.py mysql error

If I try to run build_database.py, I get
sqlalchemy.exc.ProgrammingError: (mysql.connector.errors.ProgrammingError) 1049 (42000): Unknown database 'informer_db'

If I create the db 'informer_db' and run it again, I get
alchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 1007 (HY000): Can't create database 'informer_db'; database exists

Error for docker:mysql

I try to run./quick_start.sh firstly ,but it alway return me

INFO:root:Setting up MySQL connector with connector string: mysql+mysqlconnector://informer:[email protected]:3307/informer_db?charset=utf8mb4&collation=utf8mb4_general_ci ... 


INFO:root:Attempting to load user session from database with account_id ********* ...

Traceback (most recent call last):
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/network.py", line 529, in open_connection
    self.sock.connect(sockaddr)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2276, in _wrap_pool_connect
    return fn()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 363, in connect
    return _ConnectionFairy._checkout(self)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 760, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 492, in checkout
    rec = pool._do_get()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 138, in _do_get
    with util.safe_reraise():
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 153, in reraise
    raise value
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get
    return self._create_connection()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection
    return _ConnectionRecord(self)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 437, in __init__
    self.__connect(first_connect_check=True)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 639, in __connect
    connection = pool._invoke_creator(self)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
    return dialect.connect(*cargs, **cparams)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 482, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/__init__.py", line 177, in connect
    return MySQLConnection(*args, **kwargs)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/connection.py", line 104, in __init__
    self.connect(**kwargs)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/abstracts.py", line 781, in connect
    self._open_connection()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/connection.py", line 284, in _open_connection
    self._socket.open_connection()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/network.py", line 531, in open_connection
    raise errors.InterfaceError(
mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '172.17.0.1:3307' (111 Connection refused)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/root/informer-test/app/bot.py", line 42, in <module>
    informer = TGInformer(
  File "/root/informer-test/app/informer.py", line 133, in __init__
    self.account = self.session.query(Account).filter_by(account_id=tg_account_id).first()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 3265, in first
    ret = list(self[0:1])
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 3043, in __getitem__
    return list(res)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 3367, in __iter__
    return self._execute_and_instances(context)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 3388, in _execute_and_instances
    conn = self._get_bind_args(
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 3403, in _get_bind_args
    return fn(
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/query.py", line 3382, in _connection_from_session
    conn = self.session.connection(**kw)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1121, in connection
    return self._connection_for_bind(
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1129, in _connection_for_bind
    return self.transaction._connection_for_bind(
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 431, in _connection_for_bind
    conn = bind._contextual_connect()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2242, in _contextual_connect
    self._wrap_pool_connect(self.pool.connect, None),
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2279, in _wrap_pool_connect
    Connection._handle_dbapi_exception_noconnection(
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 1547, in _handle_dbapi_exception_noconnection
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 152, in reraise
    raise value.with_traceback(tb)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/base.py", line 2276, in _wrap_pool_connect
    return fn()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 363, in connect
    return _ConnectionFairy._checkout(self)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 760, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 492, in checkout
    rec = pool._do_get()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 138, in _do_get
    with util.safe_reraise():
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/util/compat.py", line 153, in reraise
    raise value
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/impl.py", line 136, in _do_get
    return self._create_connection()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 308, in _create_connection
    return _ConnectionRecord(self)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 437, in __init__
    self.__connect(first_connect_check=True)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/pool/base.py", line 639, in __connect
    connection = pool._invoke_creator(self)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/strategies.py", line 114, in connect
    return dialect.connect(*cargs, **cparams)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/sqlalchemy/engine/default.py", line 482, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/__init__.py", line 177, in connect
    return MySQLConnection(*args, **kwargs)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/connection.py", line 104, in __init__
    self.connect(**kwargs)
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/abstracts.py", line 781, in connect
    self._open_connection()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/connection.py", line 284, in _open_connection
    self._socket.open_connection()
  File "/root/informer-test/app/venv/lib/python3.10/site-packages/mysql/connector/network.py", line 531, in open_connection
    raise errors.InterfaceError(
sqlalchemy.exc.InterfaceError: (mysql.connector.errors.InterfaceError) 2003: Can't connect to MySQL server on '172.17.0.1:3307' (111 Connection refused)

I run it on Centos 7,I don't know why.

Error changing mysql port

I set the mysql port to 3306, but I still get this error:

raise errors.InterfaceError( sqlalchemy.exc.InterfaceError: (mysql.connector.errors.InterfaceError) 2003: Can't connect to MySQL server on '127.0.0.1:3320' (111 Connection refused)

Getting issues on first run with ./quick_start.sh

`

usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
[--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps]
ENV_DIR [ENV_DIR ...]
venv: error: the following arguments are required: ENV_DIR
./quick_start.sh: line 11: venv/bin/activate: No such file or directory
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: SQLAlchemy==1.3.11 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 1)) (1.3.11)
Requirement already satisfied: sqlalchemy-migrate==0.13.0 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 2)) (0.13.0)
Requirement already satisfied: Telethon==1.23.0 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 3)) (1.23.0)
Requirement already satisfied: mysql-connector-python==8.0.18 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 4)) (8.0.18)
Requirement already satisfied: gspread==3.1.0 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 5)) (3.1.0)
Requirement already satisfied: oauth2client==4.1.3 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 6)) (4.1.3)
Requirement already satisfied: python-dotenv==0.19.0 in /home/mahmud/.local/lib/python3.9/site-packages (from -r requirements.txt (line 7)) (0.19.0)
Requirement already satisfied: requests>=2.2.1 in /usr/lib/python3.9/site-packages (from gspread==3.1.0->-r requirements.txt (line 5)) (2.26.0)
Requirement already satisfied: protobuf>=3.0.0 in /home/mahmud/.local/lib/python3.9/site-packages (from mysql-connector-python==8.0.18->-r requirements.txt (line 4)) (3.17.3)
Requirement already satisfied: rsa>=3.1.4 in /home/mahmud/.local/lib/python3.9/site-packages (from oauth2client==4.1.3->-r requirements.txt (line 6)) (4.7.2)
Requirement already satisfied: pyasn1>=0.1.7 in /home/mahmud/.local/lib/python3.9/site-packages (from oauth2client==4.1.3->-r requirements.txt (line 6)) (0.4.8)
Requirement already satisfied: pyasn1-modules>=0.0.5 in /home/mahmud/.local/lib/python3.9/site-packages (from oauth2client==4.1.3->-r requirements.txt (line 6)) (0.2.8)
Requirement already satisfied: httplib2>=0.9.1 in /home/mahmud/.local/lib/python3.9/site-packages (from oauth2client==4.1.3->-r requirements.txt (line 6)) (0.19.1)
Requirement already satisfied: six>=1.6.1 in /usr/lib/python3.9/site-packages (from oauth2client==4.1.3->-r requirements.txt (line 6)) (1.16.0)
Requirement already satisfied: pbr>=1.8 in /home/mahmud/.local/lib/python3.9/site-packages (from sqlalchemy-migrate==0.13.0->-r requirements.txt (line 2)) (5.6.0)
Requirement already satisfied: Tempita>=0.4 in /home/mahmud/.local/lib/python3.9/site-packages (from sqlalchemy-migrate==0.13.0->-r requirements.txt (line 2)) (0.5.2)
Requirement already satisfied: sqlparse in /home/mahmud/.local/lib/python3.9/site-packages (from sqlalchemy-migrate==0.13.0->-r requirements.txt (line 2)) (0.4.1)
Requirement already satisfied: decorator in /home/mahmud/.local/lib/python3.9/site-packages (from sqlalchemy-migrate==0.13.0->-r requirements.txt (line 2)) (5.0.9)
Requirement already satisfied: pyaes in /home/mahmud/.local/lib/python3.9/site-packages (from Telethon==1.23.0->-r requirements.txt (line 3)) (1.6.1)
Requirement already satisfied: pyparsing<3,>=2.4.2 in /usr/lib/python3.9/site-packages (from httplib2>=0.9.1->oauth2client==4.1.3->-r requirements.txt (line 6)) (2.4.7)
Requirement already satisfied: chardet>=3.0.2 in /usr/lib/python3.9/site-packages (from requests>=2.2.1->gspread==3.1.0->-r requirements.txt (line 5)) (4.0.0)
Requirement already satisfied: idna>=2.5 in /usr/lib/python3.9/site-packages (from requests>=2.2.1->gspread==3.1.0->-r requirements.txt (line 5)) (3.2)
Requirement already satisfied: urllib3>=1.21.1 in /usr/lib/python3.9/site-packages (from requests>=2.2.1->gspread==3.1.0->-r requirements.txt (line 5)) (1.26.6)
INFO:root:env_file: informer.env
INFO:telethon.crypto.aes:libssl detected, it will be used for encryption
Traceback (most recent call last):
File "/home/mahmud/Downloads/informer-master/app/bot.py", line 33, in <module>
account_id = sys.argv[1]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/mahmud/Downloads/informer-master/app/bot.py", line 35, in <module>
raise Exception('informer.py <account_id> - account_id is a required param')
Exception: informer.py <account_id> - account_id is a required param

`

Problem with running a local docker image

I built an image OK but when I run it using

docker run my:tag

I get the following:

            ____      ____
           /  _/___  / __/___  _________ ___  ___  _____
           / // __ \/ /_/ __ \/ ___/ __ `__ \/ _ \/ ___/
         _/ // / / / __/ /_/ / /  / / / / / /  __/ /
        /___/_/ /_/_/  \____/_/  /_/ /_/ /_/\___/_/

        by @paulpierre 11-26-2019

INFO:root:SERVER_MODE: prod GAE_ENV: prod
Traceback (most recent call last):
  File "bot.py", line 23, in <module>
    informer = TGInformer(
  File "/usr/informer/informer.py", line 114, in __init__
    creds = ServiceAccountCredentials.from_json_keyfile_name(google_credentials_path, scope)
  File "/usr/local/lib/python3.8/site-packages/oauth2client/service_account.py", line 219, in from_json_keyfile_name
    with open(filename, 'r') as file_obj:
FileNotFoundError: [Errno 2] No such file or directory: 'credentials/gcloud_api.json'

maybe something wrong

1
2
after i debugged some bugs, the porgramme likes run normal. but not to continue, can u tell me why? What's wrong? Did not see auto join channels and filter.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.