Source code for langchain_community.utilities.reddit_search
"""Wrapper for the Reddit API"""fromtypingimportAny,Dict,List,Optionalfromlangchain_core.utilsimportget_from_dict_or_envfrompydanticimportBaseModel,model_validator
[docs]classRedditSearchAPIWrapper(BaseModel):"""Wrapper for Reddit API To use, set the environment variables ``REDDIT_CLIENT_ID``, ``REDDIT_CLIENT_SECRET``, ``REDDIT_USER_AGENT`` to set the client ID, client secret, and user agent, respectively, as given by Reddit's API. Alternatively, all three can be supplied as named parameters in the constructor: ``reddit_client_id``, ``reddit_client_secret``, and ``reddit_user_agent``, respectively. Example: .. code-block:: python from langchain_community.utilities import RedditSearchAPIWrapper reddit_search = RedditSearchAPIWrapper() """reddit_client:Any# Values required to access Reddit API via prawreddit_client_id:Optional[str]reddit_client_secret:Optional[str]reddit_user_agent:Optional[str]@model_validator(mode="before")@classmethoddefvalidate_environment(cls,values:Dict)->Any:"""Validate that the API ID, secret and user agent exists in environment and check that praw module is present. """reddit_client_id=get_from_dict_or_env(values,"reddit_client_id","REDDIT_CLIENT_ID")values["reddit_client_id"]=reddit_client_idreddit_client_secret=get_from_dict_or_env(values,"reddit_client_secret","REDDIT_CLIENT_SECRET")values["reddit_client_secret"]=reddit_client_secretreddit_user_agent=get_from_dict_or_env(values,"reddit_user_agent","REDDIT_USER_AGENT")values["reddit_user_agent"]=reddit_user_agenttry:importprawexceptImportError:raiseImportError("praw package not found, please install it with pip install praw")reddit_client=praw.Reddit(client_id=reddit_client_id,client_secret=reddit_client_secret,user_agent=reddit_user_agent,)values["reddit_client"]=reddit_clientreturnvalues
[docs]defrun(self,query:str,sort:str,time_filter:str,subreddit:str,limit:int)->str:"""Search Reddit and return posts as a single string."""results:List[Dict]=self.results(query=query,sort=sort,time_filter=time_filter,subreddit=subreddit,limit=limit,)iflen(results)>0:output:List[str]=[f"Searching r/{subreddit} found {len(results)} posts:"]forrinresults:category="N/A"ifr["post_category"]isNoneelser["post_category"]p=f"Post Title: '{r['post_title']}'\n\ User: {r['post_author']}\n\ Subreddit: {r['post_subreddit']}:\n\ Text body: {r['post_text']}\n\ Post URL: {r['post_url']}\n\ Post Category: {category}.\n\ Score: {r['post_score']}\n"output.append(p)return"\n".join(output)else:returnf"Searching r/{subreddit} did not find any posts:"
[docs]defresults(self,query:str,sort:str,time_filter:str,subreddit:str,limit:int)->List[Dict]:"""Use praw to search Reddit and return a list of dictionaries, one for each post. """subredditObject=self.reddit_client.subreddit(subreddit)search_results=subredditObject.search(query=query,sort=sort,time_filter=time_filter,limit=limit)search_results=[rforrinsearch_results]results_object=[]forsubmissioninsearch_results:results_object.append({"post_subreddit":submission.subreddit_name_prefixed,"post_category":submission.category,"post_title":submission.title,"post_text":submission.selftext,"post_score":submission.score,"post_id":submission.id,"post_url":submission.url,"post_author":submission.author,})returnresults_object