.un Bot Telegram come motore di ricerca per la mailing list degli utenti italiani di QGIS

Da Gennaio di quest’anno Telegram consente di utilizzare i Bot Inline. Cosa sono?

Consiste in un nuovo modo per aggiungere contenuti in qualsiasi chat, anche in gruppi o canali. Basta scrivere il suo username seguito dal testo nel campo scrittura, il Bot invierà il risultato e sarà possibile inviarlo a sua volta nella chat. Ce ne sono alcuni già disponibili. Prova a scrivere “@gif cat” mentre stai chattando con qualcuno.

Ho voluto subito fare una prova con qualcosa di semplice. Bene, ho creato un Bot per ricercare un qualsiasi contenuto all’interno di una Mailing List. Ho scelto per l’esempio di questo post la mailing list degli utenti italiani di QGIS sfruttando il motore di ricerca GMANE.

Per conoscere cosa sta dietro un Bot Inline a livello di codice sorgente basta dare un’occhiata ai tanti esempi presenti in rete: qui l’esempio a cui ho fatto riferimento. Nel caso di @qgisitbot la libreria di riferimento è python-telegram-bot che dalla versione 3.3 supporta i Bot inline. Le altre librerie utilizzate sono urllib2Beatiful Soap, rispettivamente per recuperare il contenuto e per il parsing HTML sulla pagina di ricerca di GMANE. Il tutto viene eseguito attraverso la seguente funzione:

def get_content_from_gmane(query_string):
    sanitize_query = '+'.join(query_string.split())

    page = 'http://search.gmane.org/?query={0}&group={1}'.format(sanitize_query, GROUP)
    content = urllib2.urlopen(page).read()
    soup = BeautifulSoup(content, 'html.parser')
    items = soup.body.find_all('dl')

    return items, page

Mentre la parte di codice per il funzionamento del Bot è la seguente:

def inline_query(bot, update):
    if update.inline_query is not None and update.inline_query.query:
        query = update.inline_query.query
        results = list()

        items, page = get_content_from_gmane(query)

        if not items:
            results.append(InlineQueryResultArticle(
                    id=hex(getrandbits(64))[2:],
                    title='Nessun risultato',
                    message_text='Nessun risultato, prova a cambiare il testo da ricercare.',
                    description='Prova a cambiare il testo da ricercare.',
                    thumb_url='http://lrssvt.ns0.it/qgisitbot/sad.png'))
        else:
            for i in range(len(items)):
                results.append(InlineQueryResultArticle(
                        id=hex(getrandbits(64))[2:],
                        title=remove_tags(str(items[i].dt.a)),
                        message_text='\n'.join(['*Titolo:* ' + remove_tags(str(items[i].dt.a)),
                                               '[Vai al messaggio](' + items[i].dt.a['href'] + ')',
                                               '[Visualizza l'intera ricerca](' + page + ')']),
                        parse_mode=ParseMode.MARKDOWN,
                        disable_web_page_preview=True,
                        description=remove_tags(str(items[i].dd.small)),
                        thumb_url='http://lrssvt.ns0.it/qgisitbot/qgisitbot.png'))

        bot.answerInlineQuery(update.inline_query.id, results=results)

Il funzionamento è banale, basta digitare nella chat @qgisitbot seguito dal testo da ricercare nella mailing list. Il risultato della ricerca ha al massimo 10 risultati ma è anche possibile visualizzare la pagina con tutti i risultati. Le immagini seguenti mostrano in sequenza come eseguire la ricerca sulla parola “dem“.

Ho voluto provare questa nuova funzionalità di Telegram e mi è venuta in mente questa soluzione per la mailing list. Qualsiasi altro suggerimento per migliorarne l’utilizzo è benvenuto.

Allego un video dimostrativo, grazie al contributo di Salvatore Fiandaca (@pigrecoinfinito)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s