Уведомления

Группа в Telegram: @pythonsu

Уведомления

  • Found 3494 posts.

Mobile Python » kivy взаимодействие с другими приложениями » Дек. 18, 2016 07:59:36

Привет формучанам. Вопрос из разряда, как реализовать и куда копать?
Цель сделать приложение android и добавить функцию входа в gmail, именно через официальное гугловское приложение, а не стучать прямо на гугл. Интересует именно то, как можно наладить между ними связь. Не прошу прямого решения, лишь совета, что посмотреть и почитать на эту тему. Хотя от примеров не откажусь. Заранее спасибо)

Python для новичков » Помогите, пожалуйста со scrapy - не получается пройти авторизацию » Дек. 18, 2016 01:10:09

Добрый день.
Пытаюсь запустить скрипт, который, по задумке, должен пройти авторизацию и спарсить материалы с сайта.
Я такие скрипты (а с авторизацией) никогда не делал, и слабо понимаю механизм. Воспользовался примером с https://doc.scrapy.org/en/latest/topics/logging.html
Но что-то пошло не так:
 #! coding: utf-8
__author__ = 'iam'
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.item import Item, Field
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import TakeFirst
from scrapy.http import Request, FormRequest
from scrapy import Selector
#
class ScrapyTestItem(Item):
    title = Field()
    url = Field()
class Test03Loader(XPathItemLoader):
    default_output_processor = TakeFirst()
class ScrapyTestSpider(CrawlSpider):
    name = "cr01"
    allowed_domains = ["ecom.elko.ru"]
    start_urls = ["https://ecom.elko.ru/Account/Login",
                  "https://ecom.elko.ru/Catalog/Category/SCO"
                  ]
    rules = (
        Rule(LinkExtractor(
            allow=('https://ecom.elko.ru/Catalog/Product/')),
             callback='parse_item', follow=False),
    )
    def parse(self, response):
        return [FormRequest.from_response(response,
                    formdata={'username': 'tiscom6', 'password': '6307860'},
                    callback=self.after_login)]
    def after_login(self, response):
        # check login succeed before going on
        if "authentication failed" in response.body:
            self.log("Login failed", level=log.ERROR)
            return
    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        l = Test03Loader(ScrapyTestItem(), hxs)
        l.add_xpath('title', "//h1/text()")
        l.add_value('url', response.url)
        return l.load_item()

а парсинг не получается:

 2016-12-17 23:46:21 [scrapy] INFO: Spider opened
2016-12-17 23:46:21 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 i
tems (at 0 items/min)
2016-12-17 23:46:21 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-17 23:46:21 [scrapy] DEBUG: Redirecting (302) to <GET https://ecom.elko.
ru/Account/Login?ReturnUrl=%2fCatalog%2fCategory%2fSCO> from <GET https://ecom.e
lko.ru/Catalog/Category/SCO>
2016-12-17 23:46:21 [scrapy] DEBUG: Crawled (200) <GET https://ecom.elko.ru/Acco
unt/Login> (referer: None)
2016-12-17 23:46:21 [scrapy] DEBUG: Crawled (200) <GET https://ecom.elko.ru/Acco
unt/Login?ReturnUrl=%2fCatalog%2fCategory%2fSCO> (referer: None)
2016-12-17 23:46:21 [scrapy] DEBUG: Crawled (200) <POST https://ecom.elko.ru/Acc
ount/Login> (referer: https://ecom.elko.ru/Account/Login)
2016-12-17 23:46:22 [scrapy] DEBUG: Crawled (200) <POST https://ecom.elko.ru/Acc
ount/Login?ReturnUrl=%2fCatalog%2fCategory%2fSCO> (referer: https://ecom.elko.ru
/Account/Login?ReturnUrl=%2fCatalog%2fCategory%2fSCO)
2016-12-17 23:46:22 [scrapy] INFO: Closing spider (finished)
2016-12-17 23:46:22 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 2365,
 'downloader/request_count': 5,
 'downloader/request_method_count/GET': 3,
 'downloader/request_method_count/POST': 2,
 'downloader/response_bytes': 19527,
 'downloader/response_count': 5,
 'downloader/response_status_count/200': 4,
 'downloader/response_status_count/302': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2016, 12, 17, 20, 46, 22, 105000),
 'log_count/DEBUG': 6,
 'log_count/INFO': 7,
 'request_depth_max': 1,
 'response_received_count': 4,
 'scheduler/dequeued': 5,
 'scheduler/dequeued/memory': 5,
 'scheduler/enqueued': 5,
 'scheduler/enqueued/memory': 5,
 'start_time': datetime.datetime(2016, 12, 17, 20, 46, 21, 433000)}
2016-12-17 23:46:22 [scrapy] INFO: Spider closed (finished)

Python для новичков » Python, GLSL и Mutlitexturing » Дек. 16, 2016 23:40:32

Всем привет!

Помогите, пожалуйста, разобраться.
Не могу подгрузить 2 текстуры, чтобы были доступны одновременно в шейдере. https://bitbucket.org/gen4/tutor2 - вот тут пытаюсь второй день методом тыка и копипаста ) ни чего не выходит. Что делаю не так?

Если кто-то готов помочь за вознаграждение, напишите, пожалуйста тоже.

Спасибо.

Django » Максимальная безопасность данных, хранящихся в cookie » Дек. 15, 2016 18:40:25

Имеется веб-приложение на Django 1.5.4, назовем его APP, в которое пользователь логинится со своим LDAP именем и паролем. А значит, если пароль будет перехвачен, то злоумышленник сможет получить доступ всюду, где распространяется власть LDAP. Такого допустить нельзя. Казалось бы, в чём проблема - бери хеш от пароля и всё. Ан-нет, пользователи приложения APP хотят использовать его интерфейс для доступа к другим приложениям и уже без ввода пароля, который нужен тем приложениям. Получается, что пароль надо где-то хранить. Хранить на сервере (используя django.session) - не хотят, может быть небезопасно, хотят, чтобы пароль хранился лишь у самого юзера, и то так, чтоб его не сперли. Как вариант - использовать обычные куки, на стороне сервера закодировать пароль (encrypt) ключем, который хранится на сервере (возможно, используя ещё какую-то соль) и выставить для cookie secure=True.
Что в этой схеме може быть не так? Или как поступить лучше? Не сохранять никак - не вариант

Python для новичков » Помогите, пожалуйста, с движением спрайтов в pygame » Дек. 9, 2016 15:40:40

Не могу понять, почему объекты спрайтов появляются так часто?
 from livewires import games, color
games.init(screen_width=640, screen_height=480, fps=50)
import random
class Pan(games.Sprite):
    image = games.load_image("pan.bmp")
    def __init__(self):
        super(Pan, self).__init__(image=Pan.image,
                                  x=games.mouse.x,
                                  bottom=games.screen.height - 40)
        self.score = games.Text(value=0, size=25, color=color.black,
                                top=5, right=games.screen.width - 10)
        games.screen.add(self.score)
    def update(self):
        """ Move to mouse x position. """
        self.x = games.mouse.x
        if self.left < 0:
            self.left = 0
        if self.right > games.screen.width:
            self.right = games.screen.width
        self.check_catch()
    def check_catch(self):
        """ Check if catch pizzas. """
        for pizza in self.overlapping_sprites:
            pizza.end_game()
            self.destroy()
class Falling(games.Sprite):
    image = games.load_image("pizza.bmp")
    speed = 1
    time_til_drop = 0
    def __init__(self, x, y = 90):
        """ Initialize a Pizza object. """
        super(Falling, self).__init__(image = Falling.image,
                                    x = x, y = y,
                                    dy = Falling.speed)
    def update(self):
        """ Decrease countdown or drop pizza and reset countdown. """
        if self.time_til_drop > 0:
            self.time_til_drop -= 1
        else:
            new_pizza = Falling(x=random.randrange(1, games.screen.width, 15))
            games.screen.add(new_pizza)
            # set buffer to approx 30% of pizza height, regardless of pizza speed
            self.time_til_drop = int(new_pizza.height * 1.3 / Falling.speed) + 1
    def end_game(self):
        """ End the game. """
        end_message = games.Message(value = "Game Over",
                                    size = 90,
                                    color = color.red,
                                    x = games.screen.width/2,
                                    y = games.screen.height/2,
                                    lifetime = 5 * games.screen.fps,
                                    after_death = games.screen.quit)
        games.screen.add(end_message)
def main():
    """ Play the game. """
    wall_image = games.load_image("wall.jpg", transparent = False)
    games.screen.background = wall_image
    pizza = Falling(x=0)
    games.screen.add(pizza)
    the_pan = Pan()
    games.screen.add(the_pan)
    games.mouse.is_visible = False
    games.screen.event_grab = True
    games.screen.mainloop()
# start it up!
main()

Флейм » Вакансия в г. Кемерово » Дек. 9, 2016 14:02:31

В связи с расширением штата компания ВИСТ-Групп ищет сотрудников для работы в кемеровском офисе. Офис по адресу: Кемерово, Сосновый бульвар 1

От вас:
  • Уверенное знание Python, стандартной библиотеки, стандартов, соглашений и рекомендаций принятых в отрасли.
  • Уверенное знание принципов работы HTTP и WEB, знание ES5/6, HTML5
  • Понимание принципов работы бэкенда на современных web-фреймворках
  • Опыт работы программистом от 3-х лет (желательно иметь опыт разработки решений enterprise-уровня)
  • Уверенное знание ANSI SQL (желательно PL/SQL)
  • Стек: git, Linux, RDBMS

От нас:
  • Полный рабочий день с 9:30 до 17:30 пять дней в неделю
  • Официальное трудоустройство с белой зарплатой и отпуском
  • От 50 000 до 80 000 рублей в месяц (по результатам испытательного срока 1-3 мес)

Что вас ждет:
Работа в средней величины коллективе над программной частью программно-аппаратного комплекса автоматизированного управления процессами горнодобывающего предприятия.

Заинтересованных лиц прошу писать мне в личку или на почту smirnov . property sobaken гмаил ком.
После резюме придется решить небольшое тестовое задание.

Mobile Python » узнать какой Url В браузере  » Дек. 8, 2016 16:30:12

заходим на сайт с помощью кода
 from __future__ import with_statement
import os
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
def record():
    with open('C:\op\text.txt') as  inp :
        try:
            temp = inp.readlines()
            url = temp.pop(0)
            with open ('C:\op\text.txt','w') as out:
                for i in temp :
                    out.write( i)
                return ''.join(['http:\\sait.ru', url] )
        except IndexError:
            print('1')
PACKAGE = 'com.android.chrome'
ACTIVITY = 'com.google.android.apps.chrome.Main'
COMPONENT = PACKAGE + "/" + ACTIVITY
URI = record()
device = MonkeyRunner.waitForConnection(0.1,'1777cda7')
device.startActivity(component=COMPONENT, uri=URI)
MonkeyRunner.sleep(15)
дальше по коду задаються тапы по нужным ссылкам в меню.
как то можно узнать по какой ссылке был тап и создать условие ?
например если в открытом url есть “news” То print(+)

Python для экспертов » Простой сервер и клиент на GSSAPI » Дек. 8, 2016 12:40:12

Подскажите пожалуйста как можно сделать простой сервер и клиент работающий с ним по протоколу GSSAP.

Сам смог найти библиотеку для реализации клиента https://pypi.python.org/pypi/PyGSSAPI/1.0.0 (вроде это то, что надо).

GUI » Обновление главного окна в PyQt5 » Дек. 6, 2016 22:21:04

Доброго Всем времени суток. Наверное уже не раз создавались подобные темы, но ответа на свой вопрос так и не нашел( Поэтому спрошу еще раз, уж извиняйте. Вообщем имеется прога на питоне(3.5.2) По сути брут-перебиралка. На указанном сайте проверяет логины(зарегистрирован такой или нет). Делает она это через прокси, естественно. В консольной версии отрабатывает на ура и без проблем. В оконной же версии(через PyQt 5.6) прога отрабатывает свой цикл, но при этом главное окно “зависает”. Что мы делаем в главном окне: Выбираем файл с прокси(он добавляется в очередь Queue). Выбираем файл с логинами(он тоже добавляется в очередь Queue, но уже в другую). Выставляем кол-во потоков(модуль threading), задаём таймаут соединения(модуль grab), выбираем тип прокси(http/socks), указываем куда сохранить результат. Далее запускаем обработку в несколько потоков через threading. Во время обработки, если прокси сервер не срабатывает(через try - except), то логин снова добавляется в очередь. Если прокси в очереди закончились, то файл открывается заного и создаётся снова очередь с прокси. И так, пока не закончатся все логины. В инете встречаются примеры через QThread, либо QObject. Но все они для PyQt4. Хотелось бы понять вообще принцип - какие именно данные засовывать в QThread, либо QObject. Вообщем смысл - чтобы главное окно не зависало(оно отображает еще промежуточную информацию через лейблы - сколько чего проверилось)

Флейм » Блоги » Дек. 5, 2016 11:21:19

Админ почисти блоги, а то их не слабо заспамели:
http://python.su/tag/%D1%8F%D0%BD%D1%82%D0%B0%D1%80%D0%BD%D1%8B%D1%85/
http://python.su/tag/%D0%A1%D0%9F%D0%B1/

Ну и так далее.

Web » Пагинация bottle.py » Дек. 4, 2016 15:50:33

Собственно как ее реализовать?

Django » form.has_changed() и DateTimeField » Дек. 1, 2016 08:11:21

Есть модель с DateTimeField, на её основе сделал форму, после передаю request.POST где поле DateTimeField имеет строковый вид ‘01.01.2016’.
Записываются такие данные без проблем, есть один неприятный нюанс, если использовать has_changed(), то он всегда True.
Changed_data указывает то самое поле DateTimeField.
Подскажите как обойти этот неприятный момент?

 models.py
class cost(models.Model):
    value = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    begin_date = models.DateTimeField(default=timezone.now, blank=True)
forms.py
class form_cost(forms.ModelForm):
    class Meta:
        model = model.cost
        fields = ['value', 'begin_date']
view.py
cost = model.cost.objects.get(id=int(request.POST['cost']))
form = form.form_cost(request.POST, instance=cost)
if form.has_changed():
    # Всегда True
    changed_data = form.changed_data

Базы данных » Spark cassandra connector vs python » Ноя. 30, 2016 19:36:55


spark cassandra connector vs python
python spark-cassandra-connector
I want to use spark cassandra connector in eclipse IDE + pydev.

So i downloaded builded spark cassandra connector in jar, added it in my pydev project as external source and when i type import com.datastax.spark……….. even works autofill, but when i execute it out put is no module org.datastax.

Somebody can me explain how to use this with example?

I want to use this connector to get something from cassandra for example, count rows and write something back to cassandra

Mobile Python » Нажать на ссылку которая содержит текст  » Ноя. 28, 2016 15:38:22

Использую инструмент Moneyrunner он взаимодействует с Android через Py скрипты
 from __future__ import with_statement
import os
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
def record():
    with open('C:\op\link.txt') as  inp :
        try:
            temp = inp.readlines()
            url = temp.pop(0)
            with open ('C:\op\link.txt','w') as out:
                for i in temp :
                    out.write( i)
                return ''.join(['', url] )
        except IndexError:
            print('1')
PACKAGE = 'com.android.browser'
ACTIVITY = '.BrowserActivity'
COMPONENT = PACKAGE + "/" + ACTIVITY
URI = record()
device = MonkeyRunner.waitForConnection(0.1,'1777cda7')
device.startActivity(component=COMPONENT, uri=URI)
Скрипт открывает тестируемые сайты из файла link.txt
можно ли как то в октрытом сайте нажать на ссылку с нужным текстом
Через monkeyrunner реализовать нажатие можно только через координаты
Видел реализацию нажатия на нужные кнопки через androidviewclient
 import sys
import os
import time
try:
    sys.path.append(os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
except:
    pass
from com.dtmilano.android.viewclient import ViewClient
vc = ViewClient(*ViewClient.connectToDeviceOrExit())
for bt in [ 'One', 'Two', 'Three', 'Four', 'Five' ]:
    b = vc.findViewWithText(bt)
    if b:
        (x, y) = b.getXY()
        print >>sys.stderr, "clicking b%s @ (%d,%d) ..." % (bt, x, y)
        b.touch()
    else:
        print >>sys.stderr, "b%s not found" % bt
    time.sleep(7)
print >>sys.stderr, "bye"

Python для новичков » Развернуть сайт » Ноя. 27, 2016 19:11:41

Всем привет!
Я .NET desktop разработчик, и так волею судьбы сложилось, что мне необходимо развернуть сайт по исходникам Python Django.
Как я понял, мне нужно запустить VPS сервер и установить на него всё нужное ПО (список ниже).
Выбрал первый попавшийся хостинг и попытался загрузить базу, но по непонятным мне причинам установить PostgreSql не вышло и в настройках на сайте был только MySql.
Подскажите, пожалуйста, какой выбрать лучше хостинг с поддержкой VPS, чтобы можно было поднять сайт с данным набором ПО?
И подскажите как мне двигаться дальше и на правильном ли я пути?
Заранее всем спасибо!

Системные требования:
CPU: от 1 (в зависимости от проекта)
RAM: от 1Gb (в зависимости от проекта)
HDD: от 1Gb (в зависимости от проекта)
OS: Начиная от Ubuntu 12.04 и более поздние версии.
Необходимое дополнительное ПО на сервер:
nginx
git mercurial
python-setuptools python2.7-dev
postgresql-9.3 postgresql-contrib-9.3 postgresql-server-dev-9.3
libxslt1-dev libxml2-dev
libjpeg-dev libfreetype6
libfreetype6-dev zlib1g-dev
Стабильный редис 2.8 redis-server
Supervisor
pip install psycopg2
pip install gunicorn
а так же пакеты:
easy_install virtualenv
easy_install pip

Web » tornado + telegram » Ноя. 26, 2016 14:33:00

Всем доброго времени суток!
Возникла идея создания чата на Tornado, с условием, что он(чат) будет связывать клиента на сайте и клиента в телеграмме, и они могли бы обмениваться между собой сообщениями.
Tornado с клиентом на сайте будет связываться по WebSocket, бот для телеграма написан с помощью telebot, те изначально сообщение с сайта придет в tornado и потом отправится в telegram, с этим проблем нет, проблемы в понимании как бот будет передавать сообщение от пользователя, который ответил с телеграма.
Инициатором соединения по вебсокету всегда будет клиент с сайта, а клиент с телеграмм будет ему отвечать.

бот
 bot = telebot.TeleBot(token)   
def send_message_to_manager(message, chat_id):
    bot.send_message(chat_id, message)
@bot.message_handler(content_types=['text'])
def handle_text(message):
    print (message.text)
    return message.text
bot.polling()

 class MainHandler(tornado.web.RequestHandler):
  def get(self):
    loader = tornado.template.Loader(".")
    self.write(loader.load("index.html").generate())
class WebSocketHandler(tornado.websocket.WebSocketHandler):
  def open(self):
    print ('connection opened...')
    self.write_message("The server says: 'Hello'. Connection was accepted.")
  def on_message(self, message):
    self.write_message("You said: " + message)
    telegramBots.send_message_to_manager(message)
    print ('received:', message)
  def on_close(self):
    print ('connection closed...')
application = tornado.web.Application([
  (r'/ws', WebSocketHandler),
  (r'/', MainHandler),
  (r"/(.*)", tornado.web.StaticFileHandler, {"path": "./resources"}),
])
if __name__ == "__main__":
  application.listen(9090)
  tornado.ioloop.IOLoop.instance().start()

Буду признателен, если кто нибудь поможет разобраться в том, как связать этого бота и торнадо.
Спасибо

Network » Передача файлов POST запросом. » Ноя. 23, 2016 12:33:53

Извиняюсь за дубликат темы, и, возможно, очень ламерский вопрос.
Моя задача заключается в том, что бы .pickle файл передать на сервер. Как это сделать наиболее эффективно?

Центр помощи » Упрощенный пасьянс » Ноя. 23, 2016 06:45:13

Нужно написать упрощенную версию игры пасьянс. Дана колода карт (52 карты) выполненная как список чисел, где 1 - туз 11 - валет, 12 - дама, 13 - король. Cписок перемешается с помощью shuffle, и кладуться две карты (cтановятся видимыми две цифры из списка) , если их сумма не равняется 11 , добавляется еще одна карта. Если в видимом списке появляются два числа сумма которых равняется 11, то эти два числа заменяются новыми из колоды, и список проверятся опять. Если в списке видимых цифр есть сразу 11 , 12 и 13 то все три цифры заменяются новыми из колоды и список проверяется опять. Сама игра должна состоять из трех функций: add_to_11(visible), jqk(visible) и play(deck,verbose). Первые две фунции я написал:
from random import shuffle



def add_to_11(visible):
a = []
for x in range(len(visible)):
for y in range(len(visible)):
p=visible[x] + visible[y]
if p == 11:
a.append((x,y))
return tuple(a)



def jqk(visible):
a = []
for x in range(len(visible)):
if visible[x] in [1,11,12,13] :
a.append(x)

return tuple(a)

def play(deck, verbose):
d=shuffle(deck)
Однако с третьей невдупляюсь как начать. Cама функция должна в конце вернуть len(deck), то есть количество цифр оставшихся в колоде. Буду очень благодарен за помощь!

Python для новичков » Поиск общих слов в 2 разных текстах » Ноя. 20, 2016 02:10:06

Нужно вычленить общие слова из 2 текстов, при этом, если слова образуют фразу, нужно вычленить отдельно эту фразу. Т.е., из

 a = 'the quick brown fox jumps over the lazy dog'
b = 'the quick brown dog jumps over the lazy fox'

нужно получить

 ['the quick brown','fox','jumps over the lazy','dog']

При этом в одном из текстов могут встречаться слова, не имеющиеся во втором.

Проблема в каком-то плане решается difflib:
 >>> difflib.SequenceMatcher(a=a,b=b).get_matching_blocks()
[Match(a=0, b=0, size=16), Match(a=17, b=17, size=1), Match(a=19, b=19, size=21), Match(a=41, b=41, size=1), Match(a=43, b=43, size=0)]
>>> a[0:16]
'the quick brown '
>>> a[17:18]
'o'
>>> a[19:40]
' jumps over the lazy '
>>> a[41:42]
'o'
Далее я могу отфильтровать совпадения так, чтобы оставались одни слова. Но есть серьезная проблема: difflib, похоже, не находит совпадения в разных текстах, он ищет изменения в измененном тексте. Поэтому, видно, и не заметил, что в “a” и “b” местами переставлены “dog” и “fox”. Кроме того,
если мне надо сравнить
 >>> a = 'the quick brown fox jumps over the lazy dog'
>>> b = 'jumps over the lazy dog the quick brown fox'
>>> difflib.SequenceMatcher(a=a,b=b).get_matching_blocks()
[Match(a=20, b=0, size=23), Match(a=43, b=43, size=0)]
>>> a[20:43]
'jumps over the lazy dog'
то difflib найдет только 1 фрагмент, а мне нужно получить
 ['jumps over the lazy dog', 'the quick brown fox']
В difflib есть также find_longest_match(), то тогда мне придется дробить текст на фрагменты и делать find_longest_match() до посинения. Не уверен, насколько это оптимально. Я уже писал алгоритм, который сначала искал общие слова, затем дробил слова по общим фрагментам, но скорость работы у такого алгоритма (в особенности, если тексты большие) низкая. Где мне достать нужный алгоритм? Возможно, в nltk что-нибудь подобное есть?

Флейм » Error: invalid syntax — это всегда SHIT!!! » Ноя. 17, 2016 20:40:18

Разбор синтаксической ошибки, математические операции, конкатенация и другое.
“Вас это не должно удивлять…” (Гибкий мальчик–питонщик)


Youtube. Уроки программирование Python. Урок 1. Команды.