# پایتون

![Python](https://bluedragonpets.com/wp-content/uploads/2020/02/Adult-Green-Tree-Python-900x675.jpg)

خب توی بخش قبل دیدم که با netcat فرستادیم. حالا بیاید با سوکت پروگرمینگ این کار رو توی پایتون انجام بدیم:

اول ما به کتابخونه socket نیاز داریم تا کار خودمون رو انجام بدیم. پس اون رو وارد اسکریپت خودمون میکنیم:

```
import socket
```

خب حالا یه تابع تعریف میکنیم به اسم newnym که کد ما داخل اون باشه

```
def newnym():
```

حالا باید بیایم سوکت خودمون رو ایجاد کنیم با تابع socket.socket:

```
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
```

چون ایپی ما ورژن چهار هست باید از AF\_INET استفاده کنیم و چون پروتکل ما نیز TCP هست باید از SOCK\_STREAM استفاده کنیم.

حالا بیاید به ایپی و پورت وصل شیم:

```
sck.connect(('127.0.0.1', 8888))
```

حالا بعد از متصل شدن باید احراز هویت رو انجام بدیم، یادتونه که اول باید احراز هویت انجام بشه؟

```
sck.send(b'AUTHENTICATE "1234567890"\n')
```

حالا سیگنال مورد نظر رو میفرستیم:

```
sck.send(b'SIGNAL NEWNYM\n')
```

این هم از این‌ :) تموم شد رفت. حالا تابع newnym رو صدا بزنید.

کد نهایی:

```
import socket


def newnym():
    sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sck.connect(('127.0.0.1', 8888))
    print('Connnected')
    sck.send(b'AUTHENTICATE "1234567890"\n')
    print('AUTHENTICATE "**********"')
    sck.send(b'SIGNAL NEWNYM\n')
    print('SIGNAL NEWNYM')


newnym()
```

حالا تیم تور یه کتابخونه به اسم stem برای پایتون نوشتن که خودش این کار هارو انجام میده و نیازی به سوکت نویسی نیست

{% embed url="<https://stem.torproject.org/>" %}

اینجا ما از python 3.9.5 استفاده میکنیم و stem نسخه 1.8.0 ممکنه وقتی شما اینو میخونید این کد ها تغییر کرده باشن و کار نکنن.

حالا بیاید اینو نصب کنیم. برای این ما از پکیج منیجر پایتون که همون pip هست استفاده میکنیم:

```
$ pip install stem
```

وقتی که نصب شد باید بریم سر کد نویسی:

چون از کنترلر میخوایم استفاده کنیم بایدstem.control رو وارد اسکریپتمون کنیم:

```
import stem.control
```

و چون ما میخوایم از سیگنال ها استفاده کنیم باید Signal استفاده کنیم برای همین اون رو هم وارد میکنیم:

```
from stem import Signal
```

خب حالا باید به پورت وصل شیم برای این کار:

```
with stem.control.Controller.from_port(port=8888) as controller:
```

و مثل قبل باید احراز هویت انجام بشه:

```
controller.authenticate(password="1234567890")
```

اگه پسوورد نزاشتید که هیچ پارامتری بهش ندید یعنی:

```
controller.authenticate()
```

حالا وقت ارسال سیگنال هست:

```
controller.signal(Signal.NEWNYM)
```

همین. کد نهایی:

```
import stem.control
from stem import Signal

with stem.control.Controller.from_port(port=8888) as controller:
    controller.authenticate(password="1234567890")
    controller.signal(Signal.NEWNYM)
```

یادتونه گفتم این NEWNYM لیمیت داره و نمیتونید پشت سر هم زیاد بفرستید؟

حالا چیکار باید بکنیم؟ باید صبر کنیم به اون مقداری که خود تور به ما میگه. اینو چجوری باید بفهمیم؟ خب همین stem یه تابع داره که این کارو برای ما انجام میده:

```
controller.get_newnym_wait()
```

که یه تایم بر حسب ثانیه به ما میده. اگه بخواید کدی داشته باشید که اینو بگیره و صبر کنه میتونید به این صورت استفاده کنید:

```
import stem.control
from stem import Signal
import time

with stem.control.Controller.from_port(port=8888) as controller:
    controller.authenticate(password="1234567890")
    time.sleep(controller.get_newnym_wait())
    controller.signal(Signal.NEWNYM)
```

بریم برای بخش بعدی که با C بنویسیم.
