├── .gitignore ├── README.md ├── img ├── FB-f-Logo_blue_58.gif ├── FB-f-Logo_blue_58.png └── ui.png ├── main.py ├── requirements.txt └── views ├── __init__.py ├── form.py ├── formchatbox.py ├── formlogin.py ├── formloginfailure.py ├── libs ├── __init__.py └── fbchat1.py └── splash.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore compiled files 2 | *.pyc 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fbChatPython 2 | A Tkinter based GUI to login and send messages to your Facebook friends. 3 | 4 | [![Join the chat at https://gitter.im/fbChatPython/Lobby](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/fbChatPython/Lobby) 5 | 6 | ## Getting Started 7 | * Fork the repository 8 | * Clone it to your local system 9 | * Switch to project directory 10 | * Run `pip install -r requirements.txt` for Python 2 or `python -m pip install -r requirements.txt` for Python 3 to install dependencies (may need to be root/admin user to make this work if not 11 | using a virtualenv - do `sudo pip install -r requirements.txt` or `sudo python -m pip install -r requirements.txt` accordingly instead if this is the case on Linux) 12 | * Run the command `python main.py` to make the program running 13 | 14 | ### Prerequisites 15 | * Python 2 or Python 3 () 16 | * [fbchat](https://fbchat.readthedocs.io/en/master/) module 17 | * Basic knowledge of [Tkinter](http://effbot.org/tkinterbook/tkinter-index.htm) 18 | 19 | ## Note 20 | This app is a very basic one and various features are yet to be implemented. 21 | PRs are welcome! 22 | 23 | ## Features to be implemented 24 | * Improve UI 25 | -------------------------------------------------------------------------------- /img/FB-f-Logo_blue_58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/img/FB-f-Logo_blue_58.gif -------------------------------------------------------------------------------- /img/FB-f-Logo_blue_58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/img/FB-f-Logo_blue_58.png -------------------------------------------------------------------------------- /img/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/img/ui.png -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | try: 4 | from tkinter import * 5 | from views.formlogin import FormLogin 6 | from views.splash import SplashScreen 7 | from tkinter import font 8 | except ImportError: 9 | from Tkinter import * 10 | from views.formlogin import FormLogin 11 | from views.splash import SplashScreen 12 | 13 | 14 | class App: 15 | 16 | def __init__(self): 17 | self.master = Tk() 18 | self.currentWindow = FormLogin(self.master) 19 | 20 | def run(self): 21 | self.master.mainloop() 22 | 23 | 24 | if __name__ == "__main__": 25 | SplashScreen() 26 | app = App() 27 | app.run() 28 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | fbchat 2 | Pillow 3 | -------------------------------------------------------------------------------- /views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/views/__init__.py -------------------------------------------------------------------------------- /views/form.py: -------------------------------------------------------------------------------- 1 | try: 2 | from tkinter import * 3 | except ImportError: 4 | from Tkinter import * 5 | 6 | 7 | class Form(Frame): 8 | 9 | def __init__(self, master): 10 | Frame.__init__(self, master) 11 | self.master = master 12 | 13 | def _initialize(self, master): 14 | pass 15 | 16 | def _initialize_view(self, master): 17 | pass 18 | 19 | def close(self): 20 | self.master.destroy() 21 | -------------------------------------------------------------------------------- /views/formchatbox.py: -------------------------------------------------------------------------------- 1 | try: 2 | from tkinter import * 3 | from .libs.fbchat1 import * 4 | from .form import Form 5 | except ImportError: 6 | from Tkinter import * 7 | from libs.fbchat1 import * 8 | from form import Form 9 | 10 | class FormChatbox(Form): 11 | 12 | def __init__(self, master, client): 13 | Form.__init__(self, master) 14 | self._initialize(master, client) 15 | self._initialize_view(master) 16 | 17 | def _initialize(self, master, client): 18 | self.client = client 19 | self.targetFriend = StringVar() 20 | self.group = StringVar() 21 | self.broadcast = StringVar() 22 | 23 | def _initialize_view(self, master): 24 | self.master.title("fbChat") 25 | self.labelmessage = Label(master, text = "Type your message here:") 26 | self.textmessage = Text(master, width = 25, height = 5) 27 | 28 | self.friendlabel = Label(master, text = "Name of friend:") 29 | self.friendentry = Entry(master, textvariable = self.targetFriend) 30 | 31 | self.sendbutton = Button(master, 32 | text = "Send Message", 33 | command = self._on_sendbutton_clicked) 34 | 35 | self.logoutbutton = Button(master, 36 | text="Logout", 37 | command=self._on_logoutbutton_clicked) 38 | 39 | self.grouplabel = Label(master, text = "Name of Group:") 40 | self.groupentry = Entry(master, textvariable = self.group) 41 | 42 | self.broadcastlabel = Label(master, text = "Name of friend(s):") 43 | self.broadcastentry = Entry(master, textvariable = self.broadcast) 44 | 45 | self.labelmessage.grid(row = 3, sticky = W) 46 | self.textmessage.grid(row = 3, column = 1) 47 | self.friendlabel.grid(row = 0, sticky=W) 48 | self.friendentry.grid(row = 0, column = 1, sticky = W) 49 | self.sendbutton.grid(row = 4, columnspan = 2) 50 | self.logoutbutton.grid(row = 5, columnspan = 2) 51 | self.grouplabel.grid(row = 1,sticky = W) 52 | self.groupentry.grid(row = 1, column = 1, sticky = W) 53 | self.broadcastlabel.grid(row = 2,sticky = W) 54 | self.broadcastentry.grid(row = 2, column = 1, sticky = W) 55 | 56 | def _on_sendbutton_clicked(self): 57 | friend = self.friendentry.get() 58 | group = self.groupentry.get() 59 | broadcast = self.broadcastentry.get() 60 | message = self.textmessage.get(1.0, END) 61 | self.textmessage.delete(1.0, END) 62 | sendmsg(self.client, message, friend, group, broadcast) 63 | 64 | def _on_logoutbutton_clicked(self): 65 | if self.client: 66 | isSuccess = self.client.logout() 67 | 68 | if isSuccess: 69 | print("Already Logout...") 70 | self.close() 71 | 72 | try: 73 | from formlogin import FormLogin 74 | 75 | except ImportError: 76 | from .formlogin import FormLogin 77 | 78 | FormLogin(Tk()) 79 | -------------------------------------------------------------------------------- /views/formlogin.py: -------------------------------------------------------------------------------- 1 | 2 | try: 3 | from tkinter import * 4 | from .libs.fbchat1 import * 5 | from .form import Form 6 | except ImportError: 7 | from Tkinter import * 8 | from libs.fbchat1 import * 9 | from form import Form 10 | finally: 11 | from PIL import Image, ImageTk 12 | 13 | class FormLogin(Form): 14 | 15 | def __init__(self, master): 16 | Form.__init__(self, master) 17 | self._initialize(master) 18 | self._initialize_view(master) 19 | 20 | def _initialize(self, master): 21 | self.username = StringVar() 22 | self.password = StringVar() 23 | self.friend = StringVar() 24 | self.message = StringVar() 25 | 26 | def _initialize_view(self, master): 27 | self.master.title("fbChat") 28 | 29 | self.master.geometry("350x340+600+300") 30 | self.master.config(bg='#E9EBEE') 31 | self.master.resizable(0,0) 32 | fbphoto = PhotoImage(file='img/FB-f-Logo_blue_58.gif') 33 | self.master.bind("", self._on_buttonlogin_clicked) 34 | self.fbImageFrame = Frame(master,width=350,height=30,bg='#4267B2') 35 | self.fblogo = Label(master, image=fbphoto) 36 | self.fblogo.image = fbphoto 37 | self.labelid = Label(master, text="Email",fg="#365899",bg="#E9EBEE") 38 | self.labelpass = Label(master, text="Password",fg="#365899",bg="#E9EBEE") 39 | 40 | self.entryid = Entry(master, textvariable=self.username) 41 | self.entrypass = Entry(master, show="*", textvariable=self.password) 42 | 43 | self.buttonlogin = Button(master, 44 | text="Login", 45 | command=self._on_buttonlogin_clicked,bg="#3B5970",fg="#F2FFFF", 46 | cursor="hand2",activebackground="#365899",activeforeground="#F2FFFF") 47 | 48 | self.fbImageFrame.grid(row=0, column=0) 49 | self.fblogo.grid(row=1, column=0,sticky=W,pady = 10,padx=90) 50 | 51 | self.labelid.grid(row=2, column=0,sticky=W,pady = 5,padx=90) 52 | self.entryid.grid(row=3, column=0,pady=5,ipady=5) 53 | 54 | self.labelpass.grid(row=4, column=0,sticky=W,pady = 5,padx=90) 55 | self.entrypass.grid(row=5, column=0,pady=5,ipady=5) 56 | self.buttonlogin.grid(row=6, column=0, columnspan=2,pady=5) 57 | 58 | self.login_state_info = Label(self.master,text="...",bg="#E9EBEE",fg="#365899") 59 | self.login_state_info.grid(row=7,column=0,pady=5,ipady=5) 60 | 61 | def _on_buttonlogin_clicked(self, event=None): 62 | self.login_state_info.config(text="Logging you in...") 63 | self.master.update() 64 | username = self.username.get() 65 | password = self.password.get() 66 | try: 67 | client = login(username, password) 68 | self.close() 69 | try: 70 | from .formchatbox import FormChatbox 71 | except: 72 | from formchatbox import FormChatbox 73 | 74 | FormChatbox(Tk(), client) 75 | 76 | except FBchatUserError: 77 | self.close() 78 | try: 79 | from .formloginfailure import FormLoginFailure 80 | except: 81 | from formloginfailure import FormLoginFailure 82 | finally: 83 | FormLoginFailure(Tk()) 84 | -------------------------------------------------------------------------------- /views/formloginfailure.py: -------------------------------------------------------------------------------- 1 | try: 2 | from tkinter import * 3 | from .form import Form 4 | except ImportError: 5 | from Tkinter import * 6 | from form import Form 7 | 8 | 9 | class FormLoginFailure(Form): 10 | 11 | def __init__(self, master): 12 | Form.__init__(self, master) 13 | self._initialize(master) 14 | self._initialize_view(master) 15 | 16 | def _initialize(self, master): 17 | pass 18 | 19 | def _initialize_view(self, master): 20 | self.master.title("Login Error") 21 | self.master.geometry("350x200+600+300") 22 | self.master.config(bg="#E9EBEE") 23 | self.master.resizable(0,0) 24 | self.master.bind("", self._on_loginagainbutton_clicked) 25 | 26 | self.topFrame = Frame(self.master,width=350,height=30,bg="#4267B2") 27 | self.topFrame.grid(row=0,column=0,ipadx=160) 28 | 29 | self.closebutton = Button(self.topFrame,text="X",command=self._on_loginagainbutton_clicked,bd=0,\ 30 | bg="#4267B2",activebackground="#4267B2",fg="#FFFFFB",highlightthickness=0,\ 31 | cursor="hand2",activeforeground="#FFFFFB") 32 | self.closebutton.grid(row=0,column=0,sticky=W,padx=2,pady=3,ipadx=2,ipady=3) 33 | 34 | self.err_text = Label(master, text="Couldn't log you in. Incorrect Email/Password",\ 35 | bg='#BE4B49', fg='#FFFFFB') 36 | self.err_text.grid(row=1,column=0,padx=5,pady=10,ipady=10,ipadx=3) 37 | self.loginagainbutton = Button(master, 38 | text="Try logging in Again", 39 | command=self._on_loginagainbutton_clicked,cursor="hand2", 40 | bg="#3B5998",fg="#FFFFFB",activebackground="#365899",activeforeground="#FFFFFB") 41 | self.loginagainbutton.grid(row=2,column=0,pady=30,ipady=5,padx=10) 42 | 43 | def _on_loginagainbutton_clicked(self, event=None): 44 | self.master.destroy() 45 | 46 | try: 47 | from .formlogin import FormLogin 48 | 49 | except ImportError: 50 | from formlogin import FormLogin 51 | 52 | finally: 53 | FormLogin(Tk()) 54 | 55 | -------------------------------------------------------------------------------- /views/libs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coderaavan/fbChatPython/b8782873b9b09b2d62046d38cd1a94b20c5a83b1/views/libs/__init__.py -------------------------------------------------------------------------------- /views/libs/fbchat1.py: -------------------------------------------------------------------------------- 1 | import fbchat 2 | 3 | from fbchat import Client 4 | from fbchat.models import * 5 | 6 | def login(username,password): 7 | return fbchat.Client(username, password, max_tries = 1) 8 | 9 | def iLI(client): 10 | return client.isLoggedIn() 11 | 12 | def sendmsg(client, msg, name, groupname, broadcast): 13 | friendlist = [] 14 | 15 | if (len(broadcast) > 0): 16 | friendlist = broadcast.split(',') 17 | 18 | if (len(name) > 0): 19 | if name not in friendlist: 20 | friendlist.append(name) 21 | 22 | if (len(friendlist) > 0): 23 | for eachfriend in friendlist: 24 | friends = client.searchForUsers(eachfriend) 25 | friend = friends[0] 26 | 27 | sent = client.sendMessage(msg, thread_id = friend.uid, thread_type = ThreadType.USER) 28 | 29 | if not sent: 30 | print("Message not sent to " + eachfriend + "!") 31 | if sent: 32 | print("Message sent!") 33 | 34 | if (len(groupname) > 0): 35 | groups = client.searchForGroups(groupname) 36 | group = groups[0] 37 | sent = client.sendMessage(msg, thread_id = group.uid, thread_type = ThreadType.GROUP) 38 | 39 | if sent: 40 | print("Message sent!") 41 | -------------------------------------------------------------------------------- /views/splash.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | from tkinter import * 4 | from tkinter import font 5 | import time 6 | 7 | class SplashScreen(): 8 | 9 | def __init__(self): 10 | self.master = Tk() 11 | self.master.title("Loader Anim") 12 | self.master.geometry("350x200+600+200") 13 | self.master.resizable(0,0) 14 | self.master.config(bg = "#4267B2") 15 | self.master.overrideredirect(1) 16 | self.someFont = font.Font(family='Ubuntu', size=25, weight='bold') 17 | self.empty_canvas = Canvas(self.master,width = 300,height=150,bg = "#4267B2",highlightthickness=0).grid(row = 1,column = 1) 18 | self.lab1 = Label(self.empty_canvas,bg = "#4267B2",text = "facebook",font = self.someFont,fg = "#fff").grid(row = 1,column=1) 19 | self.loader_canvas = Canvas(self.master,width = 300,height=20,bg = "#4267B2",highlightthickness=0) 20 | self.loader_canvas.grid(row = 2,column = 1) 21 | loader_value = 10 22 | 23 | while loader_value < 340: 24 | self.loader = self.loader_canvas.create_rectangle(10,5,loader_value,2,fill = "#fff",width=0) 25 | loader_value += 10 26 | time.sleep(0.1) 27 | self.master.update() 28 | 29 | time.sleep(1) 30 | self.master.destroy() 31 | --------------------------------------------------------------------------------