Coder Social home page Coder Social logo

darkcat09 / python-aternos Goto Github PK

View Code? Open in Web Editor NEW
93.0 7.0 12.0 3.11 MB

[UNMAINTAINED] Unofficial Aternos API written in Python

Home Page: https://pypi.org/project/python-aternos/

License: Apache License 2.0

Python 97.21% Shell 1.08% Makefile 0.53% JavaScript 1.19%
python api aternos aternos-server reverse-engineering lxml requests minecraft websockets

python-aternos's Introduction

View my site
View detailed stats
Telegram: @dcat09

GitHub Readme Stats

🔹 My name is Andrey
🔸 I was born in July, 2009
💻 Programming languages:
Python HTML CSS JavaScript
Kotlin Java C# C++
VBScript Powershell Bash PHP
📫 [email protected]

python-aternos's People

Contributors

darkcat09 avatar ghrlt avatar laptopcat avatar lohorunk avatar lusm554 avatar notnalin avatar ruochenfu21 avatar teslaowls 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-aternos's Issues

IndexError: list index out of range

Traceback (most recent call last):
File "main.py", line 8, in
myserv = atservers[0]
IndexError: list index out of range

whenever i try to use this it always does this

main.py:

from python_aternos import Client

aternos = Client('testyname1', password='***')
atservers = aternos.get_servers()

print(atservers)

myserv = atservers[0]

print(atservers)

myserv.start()
myserv.stop()

Find server by IPx

testserv = None
for serv in atservers:
if serv.address == 'testyname1.aternos.me':
testserv = serv
if testserv != None:
# Prints a server softaware and its version
# (for example, "Vanilla 1.12.2")
print(testserv.software, testserv.version)
# Starts server
testserv.start()

whitelist.add() does nothing

This command literally does nothing it seems

my code

from python_aternos import Client, atplayers
client = Client.from_credentials("username", "password")
server = client.list_servers()[0]
whitelist = server.players(atplayers.Lists.whl)

whitelist.add("Karsonthefoxx")

During handling of the above exception, another exception occurred

При выполнении кода (When executing the code):

user = 'HotKot7002'
pasw = 'mypass'

aternos = Client(user, password=pasw)

Возникает ошибка (An error occurs):

Traceback (most recent call last):
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\js2py\evaljs.py", line 193, in execute
    compiled = cache[hashkey]
KeyError: b'\xa6c\xac\x13vF\x93~\xd3\x8f\xf2!\xc1\x86l5'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 3008, in parse
    program = self.parseProgram()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2974, in parseProgram
    body = self.parseScriptBody()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2963, in parseScriptBody       
    statement = self.parseStatementListItem()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2110, in parseStatementListItem
    return self.parseStatement()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2705, in parseStatement        
    expr = self.parseExpression()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2076, in parseExpression       
    expr = self.isolateCoverGrammar(self.parseAssignmentExpression)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1161, in isolateCoverGrammar   
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2066, in parseAssignmentExpression
    right = self.isolateCoverGrammar(self.parseAssignmentExpression)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1161, in isolateCoverGrammar
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2038, in parseAssignmentExpression
    expr = self.parseConditionalExpression()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1936, in parseConditionalExpression
    consequent = self.isolateCoverGrammar(
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1161, in isolateCoverGrammar
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2038, in parseAssignmentExpression
    expr = self.parseConditionalExpression()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1931, in parseConditionalExpression
    expr = self.inheritCoverGrammar(self.parseBinaryExpression)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1176, in inheritCoverGrammar
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1876, in parseBinaryExpression
    left = self.inheritCoverGrammar(self.parseUnaryExpression)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1176, in inheritCoverGrammar
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1852, in parseUnaryExpression
    expr = self.parsePostfixExpression()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1793, in parsePostfixExpression
    expr = self.inheritCoverGrammar(
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1176, in inheritCoverGrammar
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1729, in parseLeftHandSideExpressionAllowCall
    args = self.parseArguments()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1664, in parseArguments
    self.isolateCoverGrammar(self.parseAssignmentExpression))
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 1161, in isolateCoverGrammar
    result = parser()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 2042, in parseAssignmentExpression
    raise Ecma51NotSupported('ArrowFunctionExpression')
pyjsparser.std_nodes.Ecma51NotSupported: ArrowFunctionExpression is not supported by ECMA 5.1.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\code\server074_aternos\atrnos_test.py", line 4, in <module>
    aternos = Client(user, password=pasw)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\__init__.py", line 20, in __init__
    self.__init__(
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\__init__.py", line 29, in __init__
    self.token = self.atconn.parse_token()
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\atconnect.py", line 39, in parse_token
    ctx = atjsparse.exec(token_func)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\atjsparse.py", line 36, in exec
    ctx.execute(to_ecma5_function(f))
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\js2py\evaljs.py", line 195, in execute
    code = translate_js(
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\js2py\translators\translator.py", line 70, in translate_js
    parsed = parse_fn(js)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\js2py\translators\translator.py", line 62, in pyjsparser_parse_fn
    return parser.parse(code)
  File "C:\Users\Acer\AppData\Local\Programs\Python\Python39\lib\site-packages\pyjsparser\parser.py", line 3010, in parse
    raise self.createError(self.lineNumber, self.lastIndex, unicode(e))
js2py.internals.simplex.JsException: SyntaxError: Line 1: ArrowFunctionExpression is not supported by ECMA 5.1.

Опять же не знаю c которой стороны проблема. Но надеюсь, что она будет решена (Again, I do not know which side of the problem. But I hope that it will be solved)

ошибка с list_servers

Взял код ZeynX92, изменил под себя и решил добавить вход через восстановление сессии.

    async def start_server(self, ctx):
        await ctx.response.defer()
        get_server()
        print(atern)
        selectserver = atern.list_servers()[0]
        if selectserver.status == 'offline':
            selectserver.start(accepteula=True)
            await ctx.edit_original_message(
                embed=Embed(title='Успех!', description='Сервер запускается, пожалуйста подождите...'))
        elif selectserver.status == 'online':
            await ctx.edit_original_message(
                embed=Embed(title='Ошибка', description='Сервер уже запущен.'))
        else:
            await ctx.edit_original_message(
                embed=Embed(title='Ошибка', description='Сервер нельзя запустить'))
        atern.save_session()

После запуска этой функции ошибка:

  File "C:\Users\tigra323\Desktop\aternos\bot\cogs\aternosgl.py", line 54, in start_server
    selectserver = atern.list_servers()[0]
AttributeError: 'function' object has no attribute 'list_servers'

функция get_server()

def get_server():
    global atern
    try:
        atern = Client.restore_session
    except Exception:
        atern = Client.from_credentials(alog, apas)
    print(atern)

В каком месте я допустил ошибку не знаю, но пж скажите где и как исправить

IndexError: list index out of range

My Code:

from python_aternos import Client

aternos = Client.from_credentials('USERNAME', 'PASSWORD')
servs = aternos.list_servers()
myserv = servs[0]

myserv.start()

Error:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\test.py", line 5, in <module>
    myserv = servs[0]
IndexError: list index out of range

list object not callable

when i try to get the servers it says that,
File "main.py", line 8, in <module> servs = aternos.servers()[0] TypeError: 'list' object is not callable 

Server Status not updating

I'm working on a discord bot but the status of the server doesn't update. If the server is online when i start the script, the server status stays online even if the server is already offline for 10 min. Is there a function to update the status?

Status is not updating

Hello. I'm trying to get real-time information about server status: whether it is online and list of players. For this, i am using atwss module. The issue i encountered is that status stream does not send me signal if i turn on the server. Console and ram streams work fine.
I am using Python 3.10.5 64-bit, Windows 10
Here is my code:

import asyncio
from python_aternos import Client, atwss
import logging

# logging.basicConfig(level=logging.DEBUG)
aternos = Client.from_credentials(user, pswd)

server = aternos.list_servers()[0]
socket = server.wss()

@socket.wssreceiver(atwss.Streams.status, 'Server 1')
async def console(msg, args):
    print(args[0], 'received', msg)


async def main():
    server.start()
    await socket.connect()
    await asyncio.create_task(loop())


async def loop():
    while True:
        await asyncio.sleep(1)

asyncio.run(main())

Can't show the RAM usage

When I use myserver._info, it sends out a big dictionary which has ram when it's offline and ram and maxram when online.
maxram is kind of self-explanatory but ram also works like maxram and does not give the actual RAM usage.

And now, how I use python-aternos. I use this in my node.js project by calling the python file through the terminal with a feature in node.js and I am an absolute newbie in python.

If anyone can tell me how to get RAM usage that'll be very appreciated or if the developer itself adds something to get RAM usage, that'll be very nice of them

python_aternos.aterrors.CredentialsError: Unable to parse TOKEN from the page

`Ignoring exception in command startserver:
Traceback (most recent call last):
File "C:\Users\rimgro\PycharmProjects\aternos-utils\venv\lib\site-packages\python_aternos\atconnect.py", line 33, in parse_token
token_func = js_code[1] if len(js_code) > 1 else js_code[0]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\rimgro\PycharmProjects\aternos-utils\venv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "C:\Users\rimgro\PycharmProjects\aternos-utils\main.py", line 52, in startserver
await start_server()
File "C:\Users\rimgro\PycharmProjects\aternos-utils\main.py", line 24, in start_server
aternos = Client.from_credentials(config.ATERNOS_USERNAME, config.ATERNOS_PASSWORD)
File "C:\Users\rimgro\PycharmProjects\aternos-utils\venv\lib\site-packages\python_aternos_init_.py", line 47, in from_credentials
return cls.from_hashed(username, md5)
File "C:\Users\rimgro\PycharmProjects\aternos-utils\venv\lib\site-packages\python_aternos_init_.py", line 23, in from_hashed
atconn.parse_token()
File "C:\Users\rimgro\PycharmProjects\aternos-utils\venv\lib\site-packages\python_aternos\atconnect.py", line 39, in parse_token
raise CredentialsError(
python_aternos.aterrors.CredentialsError: Unable to parse TOKEN from the page`

Logging in using headers and cookies.

Before you implement google auth why don't you let people log in using cookies and token? I have cookies and token however I cannot log in as the account is registered using google. I snooped around your code and turns out your scrap the token and cookie so why not ask it directly form the client if he can provide it?

Couldn't start server

i need help so it keep showing me this error whenever i use webserver

File "C:\Users\\Desktop\Python\Discord\Test.py", line 3, in <module>
    from webserver import keep_alive
  File "C:\Users\\AppData\Local\Programs\Python\Python310\lib\site-packages\webserver\__init__.py", line 17, in <module>
    run_command(["sudo", "mkdir", "-p", f"/etc/webserver/{folder}"])
  File "C:\Users\\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 501, in run
    with Popen(*popenargs, **kwargs) as process:
  File "C:\Users\\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 969, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Users\\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1438, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified

and i found a python script so i copied it and then i ofcourse configured it and then after that its working pretty fine without wbeserver but it keep saying "Server couldn't open" this is the code:

import discord
import python_aternos
import webserver
from discord.ext import commands
from python_aternos import Client
from webserver import keep_alive

token =''
client = commands.Bot(command_prefix='$', help_command=None)

@client.event
async def on_ready():
    print(f'Logged in as {client.user}')

@client.command()
async def start(ctx):
    try:
        aternos = Client.from_credentials("", "")

    except Exception as e:
        await ctx.send("Couldnt log in")
        await ctx.send(f"Error {e}")
    
    else:
        servs = aternos.list_servers()

        for serv in servs:
            if serv.address == 'HorizonSmpDNK.aternos.me:12584':
                myserver = serv

        try:
            myserver.start()
        except:
            await ctx.send("Server couldn't open.")
        else:
            await ctx.send('await ctx.send("SERVER SUCESSFULLY OPENED!\nServer Address: HorizonSmpDNK.aternos.me:12584\nPort: 12584")')

keep_alive()
client.run(token)

yes i copied the code but it isnt working pls respond i really need help i've been stuck...

this is my plan so basically on discord if someone typied $start the server will start but instead it will just say "Server couldn't open" i tried $start many times... pls respond :(

Aternos Confirmation

Now you have the same problem as AternosAPI, Aternos asks for confirmation to open the server, manual, I don't know how you could automate that, but I just let you know; D

TypeError: init() got an unexpected keyword argument 'ssl_context'

from python_aternos import Client

at = Client.from_credentials("my_correct_username", "my_correct_password")

And when i run my program it takes error:

Traceback (most recent call last):
  File "C:\Me\Python\TopServ\main.py", line 4, in <module>
    at = Client.from_credentials("ElMishucha", "e1212kVTTPA4fEEg")
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\atclient.py", line 149, in from_credentials
    return cls.from_hashed(
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\atclient.py", line 93, in from_hashed
    atconn.parse_token()
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\atconnect.py", line 91, in parse_token
    loginpage = self.request_cloudflare(
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\python_aternos\atconnect.py", line 235, in request_cloudflare
    req = sendreq(
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\sessions.py", line 476, in get
    return self.request('GET', url, **kwargs)
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\cloudscraper\__init__.py", line 257, 
in request
    self.perform_request(method, url, *args, **kwargs)
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\cloudscraper\__init__.py", line 190, 
in perform_request
    return super(CloudScraper, self).request(method, url, *args, **kwargs)
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\sessions.py", line 464, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\adapters.py", line 360, in send
    resp = conn.urlopen(
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 533, in urlopen
    conn = self._get_conn(timeout=pool_timeout)
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 246, in _get_conn
    return conn or self._new_conn()
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 748, in _new_conn
    conn = self.ConnectionCls(host=actual_host, port=actual_port,
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\packages\urllib3\connection.py", line 165, in __init__
    HTTPConnection.__init__(self, host, port, strict=strict,
  File "C:\Users\El Mishucha\AppData\Local\Programs\Python\Python39\lib\site-packages\requests\packages\urllib3\connection.py", line 118, in __init__
    _HTTPConnection.__init__(self, *args, **kw)
TypeError: __init__() got an unexpected keyword argument 'ssl_context'

Library installation error

I used pip install python-aternos, but instead of successfully installing, I get this error:

      *********************************************************************************
      Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
      *********************************************************************************
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  WARNING: No metadata found in c:\users\avance\appdata\local\programs\python\python310\lib\site-packages
  Rolling back uninstall of lxml
  Moving to c:\users\avance\appdata\local\programs\python\python310\lib\site-packages\lxml-4.8.0.dist-info\
   from C:\Users\avance\AppData\Local\Programs\Python\Python310\Lib\site-packages\~xml-4.8.0.dist-info
  Moving to c:\users\avance\appdata\local\programs\python\python310\lib\site-packages\lxml\
   from C:\Users\avance\AppData\Local\Programs\Python\Python310\Lib\site-packages\~xml
error: legacy-install-failure

× Encountered error while trying to install package.
╰─> lxml

note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.

C:\Users\avance>

Unable to parse TOKEN from the page (Replit)

Traceback (most recent call last):
File "/home/runner/DiscordBot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 44, in parse_token
token_func = js_code[1] if len(js_code) > 1 else js_code[0]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "main.py", line 13, in
aternos = Client.from_credentials(user, pswd)
File "/home/runner/DiscordBot/venv/lib/python3.8/site-packages/python_aternos/init.py", line 47, in from_credentials
return cls.from_hashed(username, md5)
File "/home/runner/DiscordBot/venv/lib/python3.8/site-packages/python_aternos/init.py", line 23, in from_hashed
atconn.parse_token()
File "/home/runner/DiscordBot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 50, in parse_token
raise CredentialsError(
python_aternos.aterrors.CredentialsError: Unable to parse TOKEN from the page

pls help

python_aternos can`t parse TOKEN

Hello everyone! I have a problem, my code was broken yesterday. I have written code that got server and then users can start()/stop() server by using discord bot, but now I have an errors:

WARNING:retry.api:Check your username and password, retrying in 0 seconds...
WARNING:retry.api:Unable to parse TOKEN from the page, retrying in 0 seconds...

But my password and username is valid! I don`t know what to do with this... Can you help me, please?

import config  # Importing file with password and username
from python_aternos import Client  # Iporting Client
from python_aternos.aterrors import ServerError 
from retry import retry  # Importing retry.api, because sometimes aternos has a problems with connecting
#Discord API 
from disnake.ext import commands 
from disnake import Embed

# Creating function that will get server using credentials
@retry()
def get_server():
    atern = Client.from_credentials(f'{config.username}', f'{config.password}')
    return atern.list_servers()[0]


class AternosCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.slash_command(
        name='start_server',
        description='Starting server',
        options=[]
    )
    async def start_server(self, ctx):
        print(get_server())  # Debug, here is the problem
        try:
            get_server().start()  # Main, here is the problem too
            await ctx.send(
                embed=Embed(title='🍏 Success!', description='Server is starting, please, wait...'))
        except ServerError:  # Exception
            await ctx.send(
                embed=Embed(title='🍏 Fail!', description='Server has already started...'))

    @commands.has_permissions(administrator=True)
    @commands.slash_command(
        name='stop_server',
        description='Stopping server',
        options=[]
    )
    async def stop_server(self, ctx):
        get_server.stop()
        await ctx.send(
            embed=Embed(title='🍏 Success!', description='Server shutting down...'))


def setup(bot):
    bot.add_cog(AternosCog(bot))

Thanks in advance, I will appreciate any help : )

Unable to parse TOKEN from the page (Replit)

My Code:

import discord, asyncio, requests, os
from python_aternos import Client, atwss
from discord.utils import get
from discord.ext import commands

aternos = Client.from_credentials(os.environ['USERNAME'], os.environ['PASSWORD'])
server = aternos.list_servers()[0]
socket = server.wss()

bot = commands.Bot(command_prefix=".")
token = os.environ['TOKEN']
webhook = os.environ['WEBHOOK']
error_handler = "on"

async def socket_connect():
    server.start()
    await asyncio.gather(
        socket.connect()
    )

@bot.command(name = "start")
async def on_message(ctx):
    role = discord.utils.get(ctx.guild.roles, name="🚀︱SMP Member")
    if role in ctx.author.roles:
        embed = discord.Embed()
        embed.set_thumbnail(url = "https://i.ibb.co/QMKR4g1/milky-way-1f30c.png")
        embed.add_field(name = "Server wird gestartet!", value = "Um die Server-Logs zu sehen geh bitte in <#1003277632852463696>.", inline = False)
        embed.set_footer(text = f"Requested by {ctx.message.author.name}.", icon_url = ctx.author.avatar_url)
        await ctx.send(embed = embed)
        await socket_connect()

    elif error_handler == "on":
        embed = discord.Embed('Du brauchst die Rolle\u2000"🚀︱SMP Member" um dieß zu tun!', color = discord.Color.from_rgb((220, 44, 68)))
        embed.set_thumbnail(url = "https://images.emojiterra.com/twitter/512px/274c.png")
        await ctx.send(embed = embed)

@bot.command(name = "status")
async def on_message(ctx):
    role = discord.utils.get(ctx.guild.roles, name="🚀︱SMP Member")
    if role in ctx.author.roles:
        if server.status == "online":
            embed = discord.Embed()
            embed.set_thumbnail(url = "https://i.ibb.co/QMKR4g1/milky-way-1f30c.png")
            embed.add_field(name = "Server Status:", value = "Der Server ist Online.", inline = False)
            embed.set_footer(text = f"Requested by {ctx.message.author.name}.", icon_url = ctx.author.avatar_url)
            await ctx.send(embed = embed)

        if server.status == "offline":
            embed = discord.Embed()
            embed.set_thumbnail(url = "https://i.ibb.co/QMKR4g1/milky-way-1f30c.png")
            embed.add_field(name = "Server Status:", value = 'Der Server ist Offline, um ihn zu starten schreibe ".start" in <#1002498426023465010>.', inline = False)
            embed.set_footer(text = f"Requested by {ctx.message.author.name}.", icon_url = ctx.author.avatar_url)
            await ctx.send(embed = embed)

    elif error_handler == "on":
        embed = discord.Embed(title = "Error:", description = 'Du brauchst die Rolle\u2000"🚀︱SMP Member" um dieß zu tun!', color = discord.Color.from_rgb(220, 44, 68))
        embed.set_thumbnail(url = "https://images.emojiterra.com/twitter/512px/274c.png")
        await ctx.send(embed = embed)

@socket.wssreceiver(atwss.Streams.console)
async def console(msg):
    msg = msg.replace('�[K', '').replace('�[m', '').replace('>....', '').replace('�[?1h�=�[?2004h', '').replace('�[38;2;85;255;85m', '').replace('�[33;1m', '').replace('�[38;2;255;255;85m', '').replace('�[38;2;0;170;0m-', '')

    data = {
    "content" : f"```{msg}```",
    }
    
    requests.post(webhook, json = data)

bot.run(token)

Error:

Traceback (most recent call last):
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 33, in parse_token
    token_func = js_code[1] if len(js_code) > 1 else js_code[0]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 6, in <module>
    aternos = Client.from_credentials(os.environ['USERNAME'], os.environ['PASSWORD'])
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/__init__.py", line 47, in from_credentials
    return cls.from_hashed(username, md5)
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/__init__.py", line 23, in from_hashed
    atconn.parse_token()
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 39, in parse_token
    raise CredentialsError(
python_aternos.aterrors.CredentialsError: Unable to parse TOKEN from the page

ValueError in random string generator

I've recently run unit tests and have found a bug in generate_aternos_rand function.
It raised a ValueError exception.

To reproduce the bug, just call random string generator in an endless loop:

>>> from python_aternos import AternosConnect
>>> conn = AternosConnect()
>>> while True:
...     a = conn.generate_aternos_rand()
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/home/darkcat09/code/python-aternos/python_aternos/atconnect.py", line 128, in generate_aternos_rand
    rand_alphanum = self.convert_num(rand, 36) + ('0' * 17)
  File "/home/darkcat09/code/python-aternos/python_aternos/atconnect.py", line 154, in convert_num
    num = int(sliced)
ValueError: invalid literal for int() with base 10: '7897404767541758e-05'
>>>

The problem is in the generator algorithm.
It was copied from Aternos JavaScript code without any checks.
So, the function must be rewritten.

do I need to buy cloudscraper premium version?

That happen when I tried to login
aternos = Client.from_credentials('username', 'pass')

cloudscraper.exceptions.CloudflareChallengeError: Detected a Cloudflare version 2 Captcha challenge, This feature is not available in the opensource (free) version.

requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://aternos.org/go/ (Replit)

My Code:

Traceback (most recent call last):
  File "main.py", line 6, in <module>
    aternos = Client.from_credentials(os.environ['USERNAME'], os.environ['PASSWORD'])
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atclient.py", line 86, in from_credentials
    return cls.from_hashed(username, md5)
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atclient.py", line 52, in from_hashed
    atconn.parse_token()
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 46, in parse_token
    loginpage = self.request_cloudflare(
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 247, in request_cloudflare
    return self.request_cloudflare(
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/python_aternos/atconnect.py", line 263, in request_cloudflare
    req.raise_for_status()
  File "/home/runner/Aternos-Bot/venv/lib/python3.8/site-packages/requests/models.py", line 1022, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://aternos.org/go/

token_func error

The first few lines

from python_aternos import Client

aternos = Client('Username', password='password')
atservers = aternos.servers

give the error for line 37 in atconnect.py

token_funk = js_code[1] if len(js_code) > 1 else js_code[0]
IndexError: List index out of range

maybe I'm being stupid but I have no idea why I get this error.

Edit: I have fixed this error and now it just doesn't work

Edit2: Nvm it's broken again I never knew how hopeless I was hahaha

Updated Aternos internal API?

I can't seem to list servers anymore after approximately July 25, 2022 : 09:00:00 AM
list_servers() returns an empty list instead of a list of server objects
Here's the debug from logging module

Python 3.8.10 (default, Jun  2 2021, 10:49:15)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> from python_aternos import Client
>>> a = Client.from_credentials(REDACTED)
DEBUG:root:Requesting(GET)https://aternos.org/go/
DEBUG:root:headers={}
DEBUG:root:params={}
DEBUG:root:data={}
DEBUG:root:req-cookies={'ATERNOS_SESSION': ''}
DEBUG:root:session-cookies=<RequestsCookieJar[]>
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): aternos.org:443
DEBUG:urllib3.connectionpool:https://aternos.org:443 "GET /go/ HTTP/1.1" 200 None
DEBUG:root:AternosConnect received: <!DOCTYPE html>
<html>
    <head>
        <base href="/panel/"/>

INFO:root:GET completed with 200 status
DEBUG:root:Requesting(POST)https://aternos.org/panel/ajax/account/login.php
DEBUG:root:headers={'X-Requested-With': 'XMLHttpRequest'}
DEBUG:root:params={'TOKEN': REDACTED, 'SEC': REDACTED}
DEBUG:root:data={'user': REDACTED, 'password': REDACTED}
DEBUG:root:req-cookies={'ATERNOS_SESSION': ''}
DEBUG:root:session-cookies=<RequestsCookieJar[<Cookie ATERNOS_LANGUAGE=en for aternos.org/>, <Cookie ATERNOS_SEC_REDACTED for aternos.org/>]>
DEBUG:urllib3.connectionpool:https://aternos.org:443 "POST /panel/ajax/account/login.php?TOKEN=REDACTED&SEC=REDACTED HTTP/1.1" 200 None
DEBUG:root:AternosConnect received: {"success":true,"error":null,"message":null,"show2FA":false}
INFO:root:POST completed with 200 status
>>> s = a.list_servers()
DEBUG:root:Requesting(GET)https://aternos.org/servers/
DEBUG:root:headers={}
DEBUG:root:params={}
DEBUG:root:data={}
DEBUG:root:req-cookies={'ATERNOS_SESSION': REDACTED}
DEBUG:root:session-cookies=<RequestsCookieJar[<Cookie ATERNOS_LANGUAGE=en for aternos.org/>, <Cookie ATERNOS_SEC_REDACTED for aternos.org/>]>
DEBUG:urllib3.connectionpool:https://aternos.org:443 "GET /servers/ HTTP/1.1" 200 None
DEBUG:root:AternosConnect received: <!DOCTYPE html>
<html class="account-layout">
<head>
    <meta ch
INFO:root:GET completed with 200 status
>>> s
[]

I have confirmed that I have 2 different servers (see screenshot below)
image

Live-updating of servers, passing args to wssreceiver

As I'm building a live-dashboard for servers right now, I am in need of a live-updating method whereby the latest changes are mirrored from Aternos. Currently, I use a login function like this (working):

def update():
    global session, servers

    try:
        session = Client.from_credentials(credentials['username'], credentials['password'])
        servers = session.list_servers()
    except:
        raise Exception('Login information incorrect, or not given. Please set your credentials in \'credentials.py\'')

However, in the future it would be nice to have this built-in, perhaps using modified save and recall session functions.

Account Suspended

My aternos account suspended by using it. Is there a way to prevent my accounts from getting banned.

IMG_20220506_105617.jpg

AternosCredentialsError

Everything give me a AternosCredentialsError

I already checked the password and the user many times and they are fine

from python_aternos import Client 

aternos = Client('Marlonsito2', password='********')

atservers = aternos.get_servers()

print(atservers)

Everythings give me a AternosCredentialsError I created a new account to see if it was that, but still, do you know what happens?

The output of this command:

Traceback (most recent call last):
  File "/home/marlonsc/.local/lib/python3.9/site-packages/python_aternos/atconnect.py", line 33, in parse_token
    self.token = re.search(
TypeError: 'NoneType' object is not subscriptable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/marlonsc/app/abrircesasv.py", line 3, in <module>
    aternos = Client('Marlonsito2', password='*******')
  File "/home/marlonsc/.local/lib/python3.9/site-packages/python_aternos/__init__.py", line 20, in __init__
    self.__init__(
  File "/home/marlonsc/.local/lib/python3.9/site-packages/python_aternos/__init__.py", line 29, in __init__
    self.token = self.atconn.parse_token()
  File "/home/marlonsc/.local/lib/python3.9/site-packages/python_aternos/atconnect.py", line 38, in parse_token
    raise aterrors.AternosCredentialsError(
python_aternos.aterrors.AternosCredentialsError: Unable to parse TOKEN from the page

Note: The password is´nt **** is my real pass but for security reason i can´t post it

Client has no attribute 'from_credentials'

Я сделал все, как в "Readme". Установил необходимые библиотеки, импортировал python-aternos
Но при написании кода выяснилось, что Client не имеет атрибута from_credentials()

Есть ли какие-то предположения по этому поводу? Может быть, я делаю что-то не так;D

Мой код:

user = 'HotKot7002'
password = 'My password'
from python_aternos import Client

aternos = Client.from_credentials(user, password)

Ошибка:

File "c:\code\server074_aternos\atrnos_test.py", line 5, in <module>  
    aternos = Client.from_credentials(user, password)
AttributeError: type object 'Client' has no attribute 'from_credentials'

what is hashed?

i saw in the docs that you can also start server from hased by doing aternos = Client.from_hashed('example', 'cc03e747a6afbbcbf8be7668acfebee5')
but i don't know what that hash is can you pls tel me how i can get that hashed i searched everywhere for it but couldn't find anything at all

How to list current players?

I can see that the python-aternos/atplayers.py file has a method to list current players in game, but I was wondering if there was a simple function to call in order to do so.

Error in __init__.py

The Problem

Using a java maven build for a bot designed specifically for a private server, I attempted to integrate this python aternos api using jython and somehow got an error within the library

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File ":\directory\to\project\repository\COMPILED.jar\Lib\python_aternos\__init__.py", line 15
    def __init__(self, atconn:atconnect.AternosConnect) -> None:
                            ^
SyntaxError: mismatched input ':' expecting RPAREN

I couldn't find any more way to execute a py script inside a compiled jar file so I was left with this very last option and was greeted by this result

Any feedback are much appreciated, thanks!


Snippet of Java code:

try (PythonInterpreter pyInit = new PythonInterpreter()) {
   pyInit.exec("from python_aternos import Client");
   pyInit.exec("aternos = Client.from_credentials('*****','*****')");
   pyInit.exec("servs = aternos.list_servers()");
   pyInit.exec("myserv = servs[0]");
   pyInit.exec("myserv.start()");
   pyInit.exec("print('Server has been pinged to start')");
}

RecursionError: maximum recursion depth exceeded while calling a Python object

entire traceback

Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/__init__.py", line 47, in from_credentials
    return cls.from_hashed(username, md5)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/__init__.py", line 23, in from_hashed
    atconn.parse_token()
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/atconnect.py", line 23, in parse_token
    loginpage = self.request_cloudflare(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/atconnect.py", line 142, in request_cloudflare
    self.request_cloudflare(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/atconnect.py", line 142, in request_cloudflare
    self.request_cloudflare(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/atconnect.py", line 142, in request_cloudflare
    self.request_cloudflare(
  [Previous line repeated 969 more times]
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/python_aternos/atconnect.py", line 134, in request_cloudflare
    req = self.session.get(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/sessions.py", line 555, in get
    return self.request('GET', url, **kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/cloudscraper/__init__.py", line 257, in request
    self.perform_request(method, url, *args, **kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/cloudscraper/__init__.py", line 190, in perform_request
    return super(CloudScraper, self).request(method, url, *args, **kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/sessions.py", line 542, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/sessions.py", line 655, in send
    r = adapter.send(request, **kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/requests/adapters.py", line 439, in send
    resp = conn.urlopen(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/urllib3/connectionpool.py", line 699, in urlopen
    httplib_response = self._make_request(
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/urllib3/connectionpool.py", line 445, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/urllib3/connectionpool.py", line 440, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.8/http/client.py", line 1344, in getresponse
    response.begin()
  File "/usr/lib/python3.8/http/client.py", line 331, in begin
    self.headers = self.msg = parse_headers(self.fp)
  File "/usr/lib/python3.8/http/client.py", line 225, in parse_headers
    return email.parser.Parser(_class=_class).parsestr(hstring)
  File "/usr/lib/python3.8/email/parser.py", line 67, in parsestr
    return self.parse(StringIO(text), headersonly=headersonly)
  File "/usr/lib/python3.8/email/parser.py", line 56, in parse
    feedparser.feed(data)
  File "/usr/lib/python3.8/email/feedparser.py", line 176, in feed
    self._call_parse()
  File "/usr/lib/python3.8/email/feedparser.py", line 180, in _call_parse
    self._parse()
  File "/usr/lib/python3.8/email/feedparser.py", line 295, in _parsegen
    if self._cur.get_content_maintype() == 'message':
  File "/usr/lib/python3.8/email/message.py", line 594, in get_content_maintype
    ctype = self.get_content_type()
  File "/usr/lib/python3.8/email/message.py", line 578, in get_content_type
    value = self.get('content-type', missing)
  File "/usr/lib/python3.8/email/message.py", line 471, in get
    return self.policy.header_fetch_parse(k, v)
  File "/usr/lib/python3.8/email/_policybase.py", line 316, in header_fetch_parse
    return self._sanitize_header(name, value)
  File "/usr/lib/python3.8/email/_policybase.py", line 287, in _sanitize_header
    if _has_surrogates(value):
  File "/usr/lib/python3.8/email/utils.py", line 57, in _has_surrogates
    s.encode()

403 Client Error: Forbidden for url: https://aternos.org/go/

Working on my PC, but on Heroku it doesn't

2022-08-19T08:55:03.513569+00:00 heroku[main.1]: State changed from starting to up
2022-08-19T08:55:04.868907+00:00 app[main.1]: /app/.heroku/python/lib/python3.10/site-packages/js2py/internals/opcodes.py:801: SyntaxWarning: "is" with a literal. Did you mean "=="?
2022-08-19T08:55:04.868922+00:00 app[main.1]: if not issubclass(globals()[g], OP_CODE) or g is 'OP_CODE':
2022-08-19T08:55:05.180286+00:00 app[main.1]: STARTED
2022-08-19T08:55:09.474411+00:00 app[main.1]: Traceback (most recent call last):
2022-08-19T08:55:09.474425+00:00 app[main.1]: File "/app/main.py", line 67, in <module>
2022-08-19T08:55:09.474560+00:00 app[main.1]: bot.polling()
2022-08-19T08:55:09.474568+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/telebot/__init__.py", line 621, in polling
2022-08-19T08:55:09.474841+00:00 app[main.1]: self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
2022-08-19T08:55:09.474841+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/telebot/__init__.py", line 695, in __threaded_polling
2022-08-19T08:55:09.475116+00:00 app[main.1]: raise e
2022-08-19T08:55:09.475126+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/telebot/__init__.py", line 651, in __threaded_polling
2022-08-19T08:55:09.475384+00:00 app[main.1]: self.worker_pool.raise_exceptions()
2022-08-19T08:55:09.475399+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/telebot/util.py", line 147, in raise_exceptions
2022-08-19T08:55:09.475499+00:00 app[main.1]: raise self.exception_info
2022-08-19T08:55:09.475507+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/telebot/util.py", line 93, in run
2022-08-19T08:55:09.475592+00:00 app[main.1]: task(*args, **kwargs)
2022-08-19T08:55:09.475602+00:00 app[main.1]: File "/app/main.py", line 60, in Output_Marks
2022-08-19T08:55:09.475688+00:00 app[main.1]: startserver(user_id)
2022-08-19T08:55:09.475705+00:00 app[main.1]: File "/app/main.py", line 34, in startserver
2022-08-19T08:55:09.475773+00:00 app[main.1]: aternos = Client.from_credentials(username, password)
2022-08-19T08:55:09.475775+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/python_aternos/atclient.py", line 86, in from_credentials
2022-08-19T08:55:09.475857+00:00 app[main.1]: return cls.from_hashed(username, md5)
2022-08-19T08:55:09.475867+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/python_aternos/atclient.py", line 52, in from_hashed
2022-08-19T08:55:09.475944+00:00 app[main.1]: atconn.parse_token()
2022-08-19T08:55:09.475955+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/python_aternos/atconnect.py", line 46, in parse_token
2022-08-19T08:55:09.476043+00:00 app[main.1]: loginpage = self.request_cloudflare(
2022-08-19T08:55:09.476052+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/python_aternos/atconnect.py", line 263, in request_cloudflare
2022-08-19T08:55:09.476165+00:00 app[main.1]: req.raise_for_status()
2022-08-19T08:55:09.476167+00:00 app[main.1]: File "/app/.heroku/python/lib/python3.10/site-packages/requests/models.py", line 1021, in raise_for_status
2022-08-19T08:55:09.476482+00:00 app[main.1]: raise HTTPError(http_error_msg, response=self)
2022-08-19T08:55:09.476571+00:00 app[main.1]: requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://aternos.org/go/

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.