bots: Create Link Shortener Bot.
Create Link Shortener Bot using the goo.gl Link Shortening API. Link Shortener Bot can be mentioned in a conversation, and it will respond with shortened, goo.gl links for every URL in the message. For example, > @link_shortener_bot @johnsmith Check out this file: > https://github.com/zulip/python-zulip-api/blob/master/zulip_bots/ and Link Shortener Bot would respond > https://github.com/zulip/python-zulip-api/blob/master/zulip_bots/: > https://goo.gl/Mt5z3c In order to use Link Shortener Bot, an API key for goo.gl must be set in `link_shortener.conf` in the `link_shortener` folder.
This commit is contained in:
		
							parent
							
								
									e5685adf2e
								
							
						
					
					
						commit
						29e22c2c0a
					
				
					 7 changed files with 174 additions and 0 deletions
				
			
		|  | @ -52,6 +52,7 @@ setuptools_info = dict( | |||
|         'html2text',  # for bots/define | ||||
|         'BeautifulSoup4',  # for bots/googlesearch | ||||
|         'lxml',  # for bots/googlesearch | ||||
|         'requests'  # for bots/link_shortener | ||||
|     ], | ||||
| ) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										0
									
								
								zulip_bots/zulip_bots/bots/link_shortener/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								zulip_bots/zulip_bots/bots/link_shortener/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										17
									
								
								zulip_bots/zulip_bots/bots/link_shortener/doc.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								zulip_bots/zulip_bots/bots/link_shortener/doc.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| # Link Shortener Bot | ||||
| 
 | ||||
| Link Shortener Bot is a Zulip bot that will shorten URLs ("links") in a | ||||
| conversation. It uses the [goo.gl URL shortener API] to shorten its links. | ||||
| 
 | ||||
| Links can be anywhere in the message, for example, | ||||
| 
 | ||||
|  > @**Link Shortener Bot** @**Joe Smith** See | ||||
|  > https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots | ||||
|  > for a list of all Zulip bots. | ||||
| 
 | ||||
| and LS Bot would respond | ||||
| 
 | ||||
|  > https://github.com/zulip/python-zulip-api/tree/master/zulip_bots/zulip_bots/bots: | ||||
|  > **https://goo.gl/NjLZZH** | ||||
| 
 | ||||
| [goo.gl URL shortener API]: https://goo.gl | ||||
|  | @ -0,0 +1,19 @@ | |||
| { | ||||
|   "request": { | ||||
|     "api_url": "https://www.googleapis.com/urlshortener/v1/url", | ||||
|     "method": "POST", | ||||
|     "params": { | ||||
|       "key": "qwertyuiop" | ||||
|     }, | ||||
|     "json": { | ||||
|       "longUrl": "https://www.github.com/zulip/zulip" | ||||
|     } | ||||
|   }, | ||||
|   "response": { | ||||
|     "id": "https://goo.gl/6uoWKb" | ||||
|   }, | ||||
|   "response-headers": { | ||||
|     "status": 200, | ||||
|     "content-type": "application/json; charset=utf-8" | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,2 @@ | |||
| [link_shortener] | ||||
| key = <your API key> | ||||
							
								
								
									
										80
									
								
								zulip_bots/zulip_bots/bots/link_shortener/link_shortener.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								zulip_bots/zulip_bots/bots/link_shortener/link_shortener.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | |||
| import re | ||||
| import requests | ||||
| 
 | ||||
| class LinkShortenerHandler(object): | ||||
|     '''A Zulip bot that will shorten URLs ("links") in a conversation using the | ||||
|     goo.gl URL shortener. | ||||
|     ''' | ||||
| 
 | ||||
|     def usage(self): | ||||
|         return ( | ||||
|             'Mention the link shortener bot in a conversation and then enter ' | ||||
|             'any URLs you want to shorten in the body of the message. \n\n' | ||||
|             '`key` must be set in `link_shortener.conf`.') | ||||
| 
 | ||||
|     def initialize(self, bot_handler): | ||||
|         self.config_info = bot_handler.get_config_info('link_shortener') | ||||
| 
 | ||||
|     def handle_message(self, message, bot_handler): | ||||
|         REGEX_STR = ( | ||||
|             '(' | ||||
|             '(?:http|https):\/\/'  # This allows for the HTTP or HTTPS | ||||
|                                    # protocol. | ||||
|             '[^"<>#%\{\}|\\^~[\]` ]+'  # This allows for any character except | ||||
|                                        # for certain non-URL-safe ones. | ||||
|             ')' | ||||
|         ) | ||||
| 
 | ||||
|         content = message['content'] | ||||
| 
 | ||||
|         if content.strip() == 'help': | ||||
|             bot_handler.send_reply( | ||||
|                 message, | ||||
|                 ( | ||||
|                     'Mention the link shortener bot in a conversation and ' | ||||
|                     'then enter any URLs you want to shorten in the body of ' | ||||
|                     'the message.' | ||||
|                 ) | ||||
|             ) | ||||
|             return | ||||
| 
 | ||||
|         link_matches = re.findall(REGEX_STR, content) | ||||
| 
 | ||||
|         shortened_links = [self.shorten_link(link) for link in link_matches] | ||||
|         link_pairs = [ | ||||
|             (link_match + ': ' + shortened_link) | ||||
|             for link_match, shortened_link | ||||
|             in zip(link_matches, shortened_links) | ||||
|             if shortened_link != '' | ||||
|         ] | ||||
|         final_response = '\n'.join(link_pairs) | ||||
| 
 | ||||
|         if final_response == '': | ||||
|             bot_handler.send_reply( | ||||
|                 message, | ||||
|                 'No links found. Send "help" to see usage instructions.' | ||||
|             ) | ||||
|             return | ||||
| 
 | ||||
|         bot_handler.send_reply(message, final_response) | ||||
| 
 | ||||
|     def shorten_link(self, long_url): | ||||
|         '''Shortens a link using goo.gl Link Shortener and returns it, or | ||||
|         returns an empty string if something goes wrong. | ||||
| 
 | ||||
|         Parameters: | ||||
|             long_url (str): The original URL to shorten. | ||||
|         ''' | ||||
| 
 | ||||
|         body = {'longUrl': long_url} | ||||
|         params = {'key': self.config_info['key']} | ||||
| 
 | ||||
|         request = requests.post( | ||||
|             'https://www.googleapis.com/urlshortener/v1/url', | ||||
|             json=body, | ||||
|             params=params | ||||
|         ) | ||||
| 
 | ||||
|         return request.json().get('id', '') | ||||
| 
 | ||||
| handler_class = LinkShortenerHandler | ||||
|  | @ -0,0 +1,55 @@ | |||
| #!/usr/bin/env python | ||||
| 
 | ||||
| from zulip_bots.test_lib import BotTestCase | ||||
| 
 | ||||
| class TestLinkShortenerBot(BotTestCase): | ||||
|     bot_name = "link_shortener" | ||||
| 
 | ||||
|     def test_bot(self): | ||||
|         MESSAGE = 'Shorten https://www.github.com/zulip/zulip please.' | ||||
|         RESPONSE = 'https://www.github.com/zulip/zulip: https://goo.gl/6uoWKb' | ||||
| 
 | ||||
|         with self.mock_config_info({'key': 'qwertyuiop'}), \ | ||||
|                 self.mock_http_conversation('test_normal'): | ||||
|             self.initialize_bot() | ||||
| 
 | ||||
|             self.assert_bot_response( | ||||
|                 message = {'content': MESSAGE}, | ||||
|                 response = {'content': RESPONSE}, | ||||
|                 expected_method='send_reply' | ||||
|             ) | ||||
| 
 | ||||
|     def test_bot_empty(self): | ||||
|         MESSAGE = 'Shorten nothing please.' | ||||
|         RESPONSE = 'No links found. Send "help" to see usage instructions.' | ||||
| 
 | ||||
|         # No `mock_http_conversation` is necessary because the bot will | ||||
|         # recognize that no links are in the message and won't make any HTTP | ||||
|         # requests. | ||||
|         with self.mock_config_info({'key': 'qwertyuiop'}): | ||||
|             self.initialize_bot() | ||||
| 
 | ||||
|             self.assert_bot_response( | ||||
|                 message = {'content': MESSAGE}, | ||||
|                 response = {'content': RESPONSE}, | ||||
|                 expected_method='send_reply' | ||||
|             ) | ||||
| 
 | ||||
|     def test_bot_help(self): | ||||
|         MESSAGE = 'help' | ||||
|         RESPONSE = ( | ||||
|             'Mention the link shortener bot in a conversation and then enter ' | ||||
|             'any URLs you want to shorten in the body of the message.' | ||||
|         ) | ||||
| 
 | ||||
|         # No `mock_http_conversation` is necessary because the bot will | ||||
|         # recognize that the message is 'help' and won't make any HTTP | ||||
|         # requests. | ||||
|         with self.mock_config_info({'key': 'qwertyuiop'}): | ||||
|             self.initialize_bot() | ||||
| 
 | ||||
|             self.assert_bot_response( | ||||
|                 message = {'content': MESSAGE}, | ||||
|                 response = {'content': RESPONSE}, | ||||
|                 expected_method='send_reply' | ||||
|             ) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Skunk
						Skunk