initial commit
This commit is contained in:
		
							
								
								
									
										30
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					Copyright Vanessa McHale (c) 2017
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					      notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    * Redistributions in binary form must reproduce the above
 | 
				
			||||||
 | 
					      copyright notice, this list of conditions and the following
 | 
				
			||||||
 | 
					      disclaimer in the documentation and/or other materials provided
 | 
				
			||||||
 | 
					      with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    * Neither the name of Vanessa McHale nor the names of other
 | 
				
			||||||
 | 
					      contributors may be used to endorse or promote products derived
 | 
				
			||||||
 | 
					      from this software without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
				
			||||||
 | 
					A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
				
			||||||
 | 
					OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
				
			||||||
 | 
					SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
				
			||||||
 | 
					DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
				
			||||||
 | 
					THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					# Trump Markov Chain Twitter Bot
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Written in python with the aid of markovify and python-twitter.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Put your API keys in a file (e.g. .api-keys-trump) like so:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					api-key: API_KEY
 | 
				
			||||||
 | 
					api-sec: API_SECRET_KEY
 | 
				
			||||||
 | 
					tok:     TOKEN
 | 
				
			||||||
 | 
					tok-sec: SECRET_TOKEN
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Then run:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					python markov.py PATH_TO_API_KEYS --text PATH_TO_CORPUS.txt
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					to send one tweet at a time. 
 | 
				
			||||||
							
								
								
									
										47
									
								
								markov.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										47
									
								
								markov.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					import markovify
 | 
				
			||||||
 | 
					import twitter
 | 
				
			||||||
 | 
					import itertools
 | 
				
			||||||
 | 
					import argparse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Command line parser
 | 
				
			||||||
 | 
					parser = argparse.ArgumentParser(description='Process some integers.')
 | 
				
			||||||
 | 
					parser.add_argument('filepath', metavar='CREDENTIALS', type=str, help='an integer for the accumulator')
 | 
				
			||||||
 | 
					parser.add_argument('--text', dest='corpus', metavar='CORPUS', type=str, help='path to the text you wish to analyze')
 | 
				
			||||||
 | 
					args = parser.parse_args()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Function to help process credentials file
 | 
				
			||||||
 | 
					def drop_tag(str):
 | 
				
			||||||
 | 
					    parsed = itertools.dropwhile(lambda x: x!= ':', str)
 | 
				
			||||||
 | 
					    str2 = "".join(parsed)
 | 
				
			||||||
 | 
					    parsed2 = itertools.dropwhile(lambda x: x == ' ' or x == ':', str2)
 | 
				
			||||||
 | 
					    return "".join(parsed2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Open file with credentials
 | 
				
			||||||
 | 
					with open(args.filepath) as f:
 | 
				
			||||||
 | 
					    content = f.readlines()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Process api keys etc.
 | 
				
			||||||
 | 
					content = [drop_tag(x.strip()) for x in content] 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Get raw text of markov chain as string.
 | 
				
			||||||
 | 
					with open(args.corpus) as f:
 | 
				
			||||||
 | 
					    text = f.read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build the model.
 | 
				
			||||||
 | 
					text_model = markovify.Text(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# create twitter api object
 | 
				
			||||||
 | 
					api = twitter.Api(consumer_key=content[0],
 | 
				
			||||||
 | 
					                      consumer_secret=content[1],
 | 
				
			||||||
 | 
					                      access_token_key=content[2],
 | 
				
			||||||
 | 
					                      access_token_secret=content[3])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Generate three randomly-generated sentences of no more than 140 characters and tweet them.
 | 
				
			||||||
 | 
					selected = False
 | 
				
			||||||
 | 
					while selected == False:
 | 
				
			||||||
 | 
					    str_potentially = text_model.make_short_sentence(140)
 | 
				
			||||||
 | 
					    if not("http" in str_potentially):
 | 
				
			||||||
 | 
					        status = api.PostUpdate(str_potentially)
 | 
				
			||||||
 | 
					        print(status.text) # verify it worked
 | 
				
			||||||
 | 
					        selected = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										3461
									
								
								trumptweets.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3461
									
								
								trumptweets.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user